.NET 加载不正确的资源文件
.NET loading incorrect resource file
我正在 运行 遇到 .NET 似乎正在加载不正确的资源文件的问题,而且我还没有在网上找到任何 运行 有类似问题的资源。到目前为止,这仅在我们尝试获取信息以通过电子邮件发送时发生在后端服务器上。 运行正在使用的服务器上的区域性是 en-US。
这是我得到的(稍作编辑的)堆栈跟踪:
Could not find file ''C:\Customer\App\SubDir1\SubDir2\SubDir3\ClassLibrary.resources.dll''.
mscorlib
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at <Custom Wrapper for Assembly Loading>
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark)
at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark)
at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)
at Project.ClassLibraryResources.SubNamespace2.get_Unit()
我们确实有资源(其中两个在 ClassLibrary.dll 中,在不同的命名空间下),但它们嵌入在 DLL 中,因此 ClassLibrary.resources.dll 文件不存在。
我们没有改变资源搜索位置的 .config 文件,所以我们没有它来寻找附属程序集(这将是 ClassLibrary.resources.dll)。
其他资源似乎加载成功,这个问题是在我们升级到 .NET 4.5.2 后才出现的,几年来没有对失败的 DLL 进行代码更改。
根据找到的顶部评论 here,我一直在尝试使用 PerfMonitor 来跟踪资源管理器的事件以查看它正在尝试做什么,但我没有任何运气让它工作到目前为止。我也一直在精神上 运行 浏览该文件中链接的代码以查看可能发生的情况,但并没有取得太大成果。
我修改了尝试访问 Unit 资源以打印出当前线程的文化的函数,它按预期打印出了 en-US。
编辑:
在通过 fusionview logger 运行ning 之后,我看到它首先尝试在 en 文化下加载资源,然后再次在 en-US 文化下加载资源。它检查应用程序的配置文件,没有找到主机配置文件,并检查机器配置文件。 None 其中告诉资源寻找附属程序集。
结束编辑。
第二次编辑:
我还想重申,我们确实有一个自定义程序集 resolver/loader。它检查文件是否存在,如果存在,则对它执行 Assembly.LoadFrom() 。如果它不存在,它会检查第二个可能的位置并尝试对其执行 Assembly.LoadFrom() 。当我们打开文件流时,这在第二个 Assembly.LoadFrom 之前失败了。我意识到我们可能应该将其更改为使用配置文件来更改查找位置。我不认为这是问题所在。
结束第二次编辑。
是什么导致了这个错误?有没有更好的方法来访问 ResourceManager 的跟踪详细信息?
如有指点,将不胜感激!
堆栈跟踪表明您正在使用 CultureInfo
调用 GetString
重载。 Culture 究竟传递了什么价值?为什么不在没有文化的情况下调用 GetString 重载?
您是否在程序集上指定了 NeutralResourcesLanguageAttribute?
我正在 运行 遇到 .NET 似乎正在加载不正确的资源文件的问题,而且我还没有在网上找到任何 运行 有类似问题的资源。到目前为止,这仅在我们尝试获取信息以通过电子邮件发送时发生在后端服务器上。 运行正在使用的服务器上的区域性是 en-US。
这是我得到的(稍作编辑的)堆栈跟踪:
Could not find file ''C:\Customer\App\SubDir1\SubDir2\SubDir3\ClassLibrary.resources.dll''.
mscorlib
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at <Custom Wrapper for Assembly Loading>
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark)
at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark)
at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)
at Project.ClassLibraryResources.SubNamespace2.get_Unit()
我们确实有资源(其中两个在 ClassLibrary.dll 中,在不同的命名空间下),但它们嵌入在 DLL 中,因此 ClassLibrary.resources.dll 文件不存在。
我们没有改变资源搜索位置的 .config 文件,所以我们没有它来寻找附属程序集(这将是 ClassLibrary.resources.dll)。
其他资源似乎加载成功,这个问题是在我们升级到 .NET 4.5.2 后才出现的,几年来没有对失败的 DLL 进行代码更改。
根据找到的顶部评论 here,我一直在尝试使用 PerfMonitor 来跟踪资源管理器的事件以查看它正在尝试做什么,但我没有任何运气让它工作到目前为止。我也一直在精神上 运行 浏览该文件中链接的代码以查看可能发生的情况,但并没有取得太大成果。
我修改了尝试访问 Unit 资源以打印出当前线程的文化的函数,它按预期打印出了 en-US。
编辑: 在通过 fusionview logger 运行ning 之后,我看到它首先尝试在 en 文化下加载资源,然后再次在 en-US 文化下加载资源。它检查应用程序的配置文件,没有找到主机配置文件,并检查机器配置文件。 None 其中告诉资源寻找附属程序集。 结束编辑。
第二次编辑: 我还想重申,我们确实有一个自定义程序集 resolver/loader。它检查文件是否存在,如果存在,则对它执行 Assembly.LoadFrom() 。如果它不存在,它会检查第二个可能的位置并尝试对其执行 Assembly.LoadFrom() 。当我们打开文件流时,这在第二个 Assembly.LoadFrom 之前失败了。我意识到我们可能应该将其更改为使用配置文件来更改查找位置。我不认为这是问题所在。 结束第二次编辑。
是什么导致了这个错误?有没有更好的方法来访问 ResourceManager 的跟踪详细信息?
如有指点,将不胜感激!
堆栈跟踪表明您正在使用 CultureInfo
调用 GetString
重载。 Culture 究竟传递了什么价值?为什么不在没有文化的情况下调用 GetString 重载?
您是否在程序集上指定了 NeutralResourcesLanguageAttribute?