我在调用非托管程序集的托管 (C#) 应用程序中看到以下异常:
Caught:System.IO.FileLoadException '动态链接库 (DLL) 初始化例程失败。(来自 HRESULT 的异常:0x8007045A)'
这个 HRESULT 是什么意思,我应该从哪里开始诊断?
在升级 VS 2008 中的解决方案并且将项目针对 .NET 框架 v2.0 到具有目标运行时 v 4.0 的 VS 2010 后,我遇到了这个错误。我得到的例外是:
无法加载文件或程序集“XYZ.dll”或其依赖项之一。动态链接库 (DLL) 初始化例程失败。(来自 HRESULT 的异常:0x8007045A)":"XYZ.dll
通过将以下部分添加到设置为启动的项目的 App.config 文件中,已解决此问题:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v2.0"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
FileLoadException 类
表示找到程序集文件但无法加载时发生的错误。
当文件因为无法定位而无法加载时,会引发 FileNotFoundException 异常。如果找到文件,但由于权限不足而无法加载,则抛出 SecurityException。
FileLoadException 的默认 HRESULT 为 COR_E_FILELOAD,其值为 0x80131621,但这不是唯一可能的 HRESULT。
如果您的代码没有 PathDiscovery 权限,则此异常的错误消息可能仅包含文件或目录名称,而不是完全限定的路径。
直接从 MSDN 引用:
链接文本
这通常只是能够找到所需库的问题。
或者,您尝试加载的 DLL 正在尝试加载丢失的 DLL,请检查 DLL上的DEPENDS.EXE。
我在应用程序关闭时收到此错误。它似乎是由控件中的垃圾收集“Finalize”方法引发的,该控件引用了多个 DLL 中的多个 COM+ 模块和其他非托管程序集。
我更正了控件的 Dispose 方法以调用 GC.SuppressFinalize 并在控件中设置了一个标志,以便托管代码部分只运行一次。我还使用控件修改了表单,因此它们总是被显式关闭。