【问题标题】:Assembly.LoadFrom fails to load DLLAssembly.LoadFrom 无法加载 DLL
【发布时间】: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


【解决方案1】:

Assembly.LoadFrom 失败,因为我尝试引用的第 3 方 DLL 是作为 .NET Framework 项目构建的,并且我在 .NET Core 项目中。我通过使用一个类作为 .NET Framework 类库项目创建自己的 DLL 来确认这一点,并收到相同的错误。一旦我采用完全相同的东西并针对 .NET Standard 2.0 构建它,一切都加载正常。

我与供应商进行了交谈,一旦他们提供了针对 .NET Standard 的不同 DLL,该 DLL 就能够毫无问题地加载并找到其所有依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多