从C#3.5迁移到4后,我们开始在InitializeComponent上找不到.resources文件的例外:
An unhandled exception of type 'System.IO.FileNotFoundException' occurred in PresentationCore.dll
Additional information: Could not load file or assembly 'MYASSEMBLY.resources, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
这是一个WPF程序集,按需加载,并且没有本地化 - .resources不存在也不应该存在。迁移之前没有发生此问题,仅在应用程序中执行一组特定操作时才会发生。在另一个操作中,程序集已正确加载,并且Fusion日志显示有尝试加载.resources,但失败了,但没有抛出异常。
另外,一篇关于调试程序集负载的老博文特别指出:
注意:除非您明确调试要加载的资源的失败,否则您可能希望忽略查找具有“.resources”扩展名的程序集的失败,并将该文化设置为“中性”以外的其他内容。当ResourceManager探测附属程序集时,这些是预期的失败。 https://blogs.msdn.microsoft.com/suzcook/2003/05/29/debugging-assembly-loading-failures/
我已尝试在AssemblyInfo.cs中应用NeutralResourcesLanguage属性,但这只会使异常引用成为另一个第三方程序集。
这个问题的原因可能是什么?
答案 0 :(得分:1)
问题是由另一个动态加载的程序集中编写错误的AppDomain.AssemblyResolve事件处理程序引起的,并与.Net行为的变化相结合。这些程序集的动态加载性质解释了有时看不到错误的原因。
在InitializeComponent上添加try-catch并检查异常,表明内部异常在堆栈跟踪中有试图加载.resources dll的调用 - 编写错误的事件处理程序。
之前已经存在过.Net 3.5,但在.Net 4中有一个变化:
从.NET Framework 4开始,将为所有程序集(包括资源程序集)引发ResolveEventHandler事件。在早期版本中,未针对资源程序集引发事件。如果操作系统已本地化,则可能会多次调用该处理程序:对于后备链中的每个文化都会调用一次。