我遇到了.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运行之后,我看到它首先尝试在en文化下加载资源,然后再次在en-US文化下加载。它检查应用程序的配置文件,找不到主机配置文件,并检查机器配置文件。这些都没有告诉资源寻找附属程序集。 结束编辑。
第二次编辑: 我还想重新尝试我们有一个自定义程序集解析器/加载器。它检查文件是否存在,如果存在,则对其执行Assembly.LoadFrom()。如果它不存在,它会检入第二个可能的位置并尝试对其执行Assembly.LoadFrom()。这是在第二个Assembly.LoadFrom之前失败,当我们打开文件流时。我意识到我们应该只是改变它来使用配置文件来改变它的外观。我不认为这是问题所在。 结束第二次编辑。
可能导致此错误的原因是什么?有没有更好的方法来访问ResourceManager的跟踪详细信息?
任何指针都将非常感谢!
答案 0 :(得分:0)
堆栈跟踪表示您使用GetString
调用CultureInfo
重载。文化传递的确是什么价值?为什么不在没有Culture的情况下调用GetString重载?
你在大会上指定了NeutralResourcesLanguageAttribute吗?