Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异常丢失或异常_C#_.net 4.6.1 - Fatal编程技术网

C# 异常丢失或异常

C# 异常丢失或异常,c#,.net-4.6.1,C#,.net 4.6.1,我升级了第三方库(还原并没有修复错误),现在我的项目在运行时出现了资源异常。我已经检查了有问题的库的名称空间,并检查了culture\lib.resource.dll文件是否存在,并且我已经检查了项目的区域性实际上是我期望的区域性,但是这个错误不断出现。我如何调试这个?如何找出.Net在哪里搜索我的资源文件 更新#1 错误: Could not find any resources appropriate for the specified culture or the neutral cul

我升级了第三方库(还原并没有修复错误),现在我的项目在运行时出现了资源异常。我已经检查了有问题的库的名称空间,并检查了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

因此,似乎出于某种原因,资源管理器正试图按类型而不是按库查找特定的资源文件

因此,它不是搜索MyLibrary.resources(存在于我的en-us本地化文件夹中),而是搜索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行,文化。当我检查它时,它的名字是“en-US”。然后在没有任何明显的上下文切换的情况下,在第659行,culture.Name是空字符串。什么

这怎么可能?之后,一切似乎都合乎逻辑,因为没有加载特定于区域性的资源。但是,我们究竟如何从一种文化“en-US”变成空字符串,而不使用任何代码来分配中间的值呢

更新#4

好的,通过消去过程,代码一定已经进入了第654行。调试器跳过了if块,所以我假设它没有被执行(你知道他们怎么说假设)。但是,尝试在该行上设置断点会导致断点绑定错误。我不知道如何解决这个问题,但是,当您显式指定区域性时,为什么资源管理器会将您的区域性重置为不变量?我在这里很困惑。在第659行,还有一个“空字符串”和null之间的比较,根据我以前所有的c#经验,这应该是错误的,但是第660行被执行了

更新#5


好的,也许值得一提的是,我使用的是棱镜4。当模块中的代码尝试加载与模块相同的dll中包含的本地化资源时,会发生缺少资源错误。作为测试,我在另一个库中创建了一个虚拟枚举,其中包含一些与之关联的本地化资源。关于如何创建、配置和加载资源的所有内容都与模块中的枚举完全相同,只要资源位于不同的dll中,它就可以正常工作

结果真奇怪。似乎发生此错误是因为我没有为“中立”区域性定义资源文件。所以我没有SomeType.resx,我只有SomeType.en-us.resx。这似乎在net40中起到了作用,但我忘记的是,当我升级一个nuget软件包时,我同时也将dotNet版本升级到了.NET4.6.1。当我将所有资源文件重命名为SomeType.resx时,一切都恢复正常