我升级了第三方库(还原没有修复错误),现在我的项目在运行时出现了资源异常。我检查了有问题的库的命名空间,并检查了culture \ lib.resource.dll文件是否存在,我已经检查过项目的文化实际上是我期望它的文化,但这个错误不断出现。我该怎么调试呢?我怎样才能找到.Net正在搜索我的资源文件的位置?
更新#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
因此,由于某种原因,资源管理器似乎试图寻找每个类型而不是每个库的特定资源文件。
因此,不是搜索我的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”转到Empty String而没有任何代码在中间分配值?
更新#4
好的,所以通过消除过程,代码必须进入第654行。调试器跳过了if块,所以我认为它没有执行(你知道他们对假设的看法)。但是,尝试在该行上设置断点会导致断点绑定错误。我不知道如何解决这个问题,但是当您明确指定文化时,为什么资源管理器会将您的文化重置为不变量?我在这里很困惑。同样在第659行,'empty string'和null之间有一个比较,从我之前的所有c#经验来看,这应该是假的,但是行660被执行了?!?!
更新#5
好的,也许值得一提的是我正在使用PRISM 4.当模块中的代码尝试加载与模块相同的dll中包含的本地化资源时,会发生缺少的资源错误。作为测试,我在另一个库中创建了一个虚拟枚举,其中包含与之关联的一些本地化资源。关于我如何创建,配置和加载资源的一切与我的模块中的枚举完全相同,只要资源在不同的dll中,它似乎有效。
答案 0 :(得分:0)
非常奇怪的结果。似乎发生了这个错误,因为我没有为“中立”文化定义资源文件。所以我没有SomeType.resx,我只有SomeType.en-us.resx。这似乎在net40中有效,但我忘记了当我升级我的一个nuget包时,我也同时将dotNet版本升级到.net 4.6.1。当我将所有资源文件重命名为SomeType.resx时,一切都恢复正常。