加载程序集及其依赖项

Posted

技术标签:

【中文标题】加载程序集及其依赖项【英文标题】:Loading assemblies and its dependencies 【发布时间】:2010-09-06 12:37:49 【问题描述】:

我的应用程序在运行时从特定子文件夹动态加载程序集。这些程序集在编译时依赖于其他程序集。运行时尝试从应用程序目录加载这些。但我想把它们放到模块目录中。

有没有办法告诉运行时 dll 位于单独的子文件夹中?

【问题讨论】:

【参考方案1】:

我最近使用的一个不错的方法是为 AppDomain 的 AssemblyResolve 事件添加一个事件处理程序。

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

然后在事件处理程序方法中,您可以加载尝试使用 Assembly.Load、Assembly.LoadFrom 覆盖之一解析的程序集,并从方法中返回它。

编辑:

根据您的其他信息,我认为使用上述技术,自己专门解决对程序集的引用是唯一真正可行的方法,无需重构您的应用程序。它为您提供的是,CLR 无法解析的每个程序集的位置都可以由您的代码在运行时确定和加载......我在类似的情况下将其用于可插入架构和程序集引用完整性扫描工具。

【讨论】:

这种技术的一个很好的例子是应用程序 LINQPad。它作为单个 exe 发布,因此所有库都作为嵌入式资源包含在内。代码见albahari.com/nutshell/ch16.aspx,见linqpad.net/HowLINQPadWorks.aspx了解。 我已经尝试过这种方法,它 *** 一遍又一遍地要求相同的程序集......【参考方案2】:

您可以在清单文件中使用<probing> 元素来告诉运行时在不同的目录中查找其汇编文件。

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

例如:

<configuration>
 <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <probing privatePath="bin;bin2\subbin;bin3"/>
  </assemblyBinding>
 </runtime>
</configuration>

【讨论】:

【参考方案3】:

您可以使用应用程序配置文件中的&lt;codeBase&gt; 元素。有关“Locating the Assembly through Codebases or Probing”的更多信息。

好吧,加载的程序集没有 应用程序配置文件。

如果您知道运行时的特定文件夹,您可以使用Assembly.LoadFrom。

【讨论】:

第一个链接给出“主题不再存在”。指定 .Net 4.0 会带来它:https://msdn.microsoft.com/en-us/library/15hyw9x3%28v=vs.100%29.aspx

以上是关于加载程序集及其依赖项的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集或其依赖项之一

能加载文件或程序集“Aspose.Cells”或它的某一个依赖项。无法验证强名称签名

加载程序集时发生冲突的依赖项

未能加载文件或程序集“XXX.XXX”或它的某一个依赖项。试图加载格式不正确的程序。解决办法

未能加载文件或程序集“XXXXX”或它的某一个依赖项。试图加载格式不正确的程序。

未能加载文件或程序集 或它的某一个依赖项。试图加载格式不正确的程序。问题解决