【发布时间】:2019-09-07 03:49:53
【问题描述】:
我有一个在运行时加载插件的程序。我遍历“插件”目录中的每个目录并尝试加载找到的 DLL。每个插件都有自己的包含插件 DLL 文件的目录和另一个名为“Dependencies”的目录。如果插件的 DLL 调用 AssemblyResolve 事件,我会执行以下操作:
- 检查程序集是否已经在当前 AppDomain 中,如果是则返回
- 检查 DLL 插件的 Dependencies 目录并尝试 Assembly.LoadFrom
- 如果不满足任何条件或最后一次 LoadFrom 调用失败,则返回 null
没有 3rd 方依赖的插件或像 Newtonsoft.Json 或 NHibernate 这样的简单插件可以正常加载。我有一个依赖于 DLL 的插件,我们将称之为“custom_library.dll”。当 AssemblyResolve 事件被触发以查找此依赖项时,我可以确认该文件位于 Dependencies 目录中,甚至 File.Exists() 调用也会返回 true。
不幸的是,对此 DLL 的 Assembly.LoadFrom() 调用会引发 FileLoadException,并显示消息“无法加载文件或程序集 'custom_library.dll,版本 = 5.3.136.0,文化 = 中性,PublicKeyToken = null'。没有别的了在 HRESULT -2146233079 之外的异常中提供。我也可以通过 Visual Studio 引用此 DLL,没有问题。
为什么在运行时而不是通过 Visual Studio 的添加引用功能加载 DLL 时出现此异常?
【问题讨论】:
-
听起来像
custom_library.dll实际上确实有其他依赖项不在您当前进程的搜索路径中。如果您使用 Microsoft 的 Dependency Walker 工具depends.exe,它是否声明了您不知道的任何静态 DLL 导入?这些静态引用可能是由使用 DllImport attribute 引起的。 -
当我在 Dependency Walker 中打开 DLL 文件时,我得到了很多丢失的文件。它们是 API-MS-WIN-CORE、API-MS-WIN-EVENTING、API-MS-WIN-SECURITY、API-MS-WIN-APPMODEL、API-MS-WIN-BASE、API-MS-WIN-COREUI、 API-MS-WIN-CRT等。有很多。 IEFRAME.DLL、SHCORE.DLL 和 SHLWAPI.DLL 是唯一显示为红色的。这甚至是.NET DLL吗?如何在 Visual Studio 中正确引用它?
-
插件 DLL 是否针对与您的进程相同的框架?是否使用相同的平台(x86/x64)?
标签: c# .net reflection .net-assembly