2017-07-18 52 views
-1

我升级了第三方库(恢复没有解决错误),现在我的项目在运行时有一个资源异常。我检查了有问题的库的命名空间,并检查了文件\ lib.resource.dll文件在那里,我检查了项目的文化实际上是我期望它的文化,但是这个错误不断出现。我怎样才能调试呢?如何找出.Net正在搜索我的资源文件?不寻常的MissingManifestResourceException

更新#1

错误:

Could not find any resources appropriate for the specified 
culture or the neutral culture. Make sure "My.Library.MyType.resources" 
was correctly embedded or linked into assembly "My.Library" at compile 
time, or that all the satellite assemblies required are loadable and 
fully signed. 

堆栈跟踪:

at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName) 

更新#2

这样看来,由于某种原因,resourc e经理正试图寻找每种类型的特定资源文件而不是每个库。

因此,不是搜索我的en-us本地化文件夹中存在的MyLibrary.resources,而是寻找不存在的MyLibrary.SpecificType.resources。我在同一个项目中有另一个库,它没有这个问题,我找不到会导致这个问题的任何区别。这怎么调试?

更新#3

好了,我终于放弃了,决定来调试框架代码,我完全被什么在幕后事情困惑,这里是似乎导致代码问题来自resourcemanager.cs:

647 // WARNING: This function must be kept in sync with ResourceFallbackManager.GetEnumerator() 
648 // Return the first ResourceSet, based on the first culture ResourceFallbackManager would return 
648 internal ResourceSet GetFirstResourceSet(CultureInfo culture) 
650 { 
651  // Logic from ResourceFallbackManager.GetEnumerator() 
652  if (_neutralResourcesCulture != null && culture.Name == _neutralResourcesCulture.Name) 
653  { 
654   culture = CultureInfo.InvariantCulture; 
655  } 
656 
657  if(_lastUsedResourceCache != null) { 
658   lock (_lastUsedResourceCache) { 
659    if (culture.Name == _lastUsedResourceCache.lastCultureName) 
660     return _lastUsedResourceCache.lastResourceSet; 
661   } 
662  } 

因此,在652行,当我检查它时,culture.Name是“en-US”。然后,没有任何明显的上下文切换,在行659上,culture.Name是EMPTY STRING。什么 ?!?!

这怎么可能?之后,一切似乎都是合乎逻辑的,因为文化特定的资源没有加载。但是,我们究竟如何从一个文化“en-US”转变为空字符串而没有任何代码赋值?

更新#4

好了,通过排除法,代码必须已经进入线654调试器已经跳过了if块,所以我认为它没有执行(和你知道他们对假设的看法)。但是,尝试在该行上设置断点会导致断点绑定错误。我不知道如何解决这个问题,但是为什么当你明确指定一种文化时,资源管理器会将你的文化重置为不变的?我在这里很困惑。同样在第659行,有一个'空字符串'和null之间的比较,从我以前的c#经验来看,这应该是错误的,然而第660行被执行?!?!

更新#5

好吧,也许这是值得一提的是,我使用PRISM 4.缺少的资源错误,当一个模块中的代码尝试加载含有相同的dll的内本地化资源正在发生的事情模块。作为一项测试,我创建了一个虚拟枚举,其中一些本地化资源与另一个库中的资源相关联。有关我如何创建,配置和加载资源的一切与我的模块中的枚举完全相同,只要资源位于不同的dll中,似乎就可以工作。

回答

0

所以很奇怪的结果。看起来这个错误发生了,因为我没有为'中立'文化定义资源文件。所以我没有SomeType.resx,我只有SomeType.en-us.resx。这似乎在net40中起作用,但我忘记了当我升级了我的nuget软件包之一时,我也同时将dotNet版本升级到了.net 4.6.1。当我将所有资源文件重命名为SomeType.resx时,一切都恢复正常。