【问题标题】:How to load a referenced DLL without having the physical DLL如何在没有物理 DLL 的情况下加载引用的 DLL
【发布时间】:2016-10-07 08:06:13
【问题描述】:

我正在开发一个“执行器”,它将通过反射执行 DLL。我将配置一个实现特定接口的 DLL,执行器将加载此 DLL 并执行基于接口的方法。

在某些情况下,配置的 DLL 可能有另一个不在目录中的引用 DLL。

我的问题是:如何在没有引用的物理 DLL 的情况下加载和执行这个程序集?

例如:

-Executor calls DLL "A".
-DLL "A" references DLL "B" and DLL "C".
-DLL "B" and DLL "C" are not in the directory. 

【问题讨论】:

  • 您预计会发生什么?为什么程序集不在同一个目录中,它们在哪里?你试过什么?例如,请参阅Resolve assembly references from another folderHow to add folder to assembly search path at runtime in .NET? 等。
  • 那么他们在哪里?它们要么位于系统目录之一/GAC 中,并且在您加载 DLL“A”时会正常加载,或者找不到它们并且加载 DLL“A”将失败。
  • @nos 我没有 DLL,它们的唯一本地是在 DLL "A" 的引用中:(
  • @CodeCaster 我正在尝试编译 DLL "A" 以将 DLL "B" 和 DLL "C" 一起携带。有可能吗?
  • 这是一个完全不同的问题,它被称为“合并程序集”。在提出问题之前尝试搜索,无论是作为问题还是在 cmets 中。

标签: c#


【解决方案1】:

当程序集加载器在运行时解析引用时,丢失的物理文件总是会导致绑定过程失败并出现异常(当应用程序需要来自该程序集的代码时,它需要在物理上存在 - 即是搜索路径中的任何位置,包括 GAC)。

(即使您会找到一种拦截加载过程的方法——这在 .NET 中是可能的——如果不最终以某种方式提供所引用程序集的 IL,无论是通过下载、按需提供的方式,你都不会逃脱 -编译什么的)。

“运行时如何定位程序集”中的更多信息,请点击此处:https://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.110).aspx

尽管您删除其他依赖项的想法是有道理的(减少“DLL 地狱”),但要考虑的一个选项是将多个相互依赖的程序集合并到一个二进制文件中,例如这个免费工具也可作为 NuGet 包使用:http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

【讨论】:

    【解决方案2】:

    假设您不想将这些dll放入工作目录,则需要将dll B和C注册到全局程序集缓存(GAC)

    您可以参考this wiki 帖子或google GAC 进一步信息。

    【讨论】:

    • 不,您不需要。您可以覆盖搜索程序集的探测机制。
    猜你喜欢
    • 2023-04-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多