加载程序集及其依赖项

时间:2020-03-05 18:41:56  来源:igfitidea点击:

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

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

解决方案

回答

我们可以在清单文件中使用<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>

回答

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

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

然后,在事件处理程序方法中,我们可以使用Assembly.Load,Assembly.LoadFrom替代之一加载尝试解析的程序集,然后从该方法返回它。

编辑:

根据其他信息,我认为使用以上技术,特别是自己自行解决对程序集的引用是唯一有效的方法,无需重新构建应用即可。它为我们提供的是可以在运行时由代码确定并加载CLR无法解析的每个程序集的位置。在可插拔体系结构和程序集引用完整性中,我在类似的情况下使用了此方法扫描工具。

回答

我们可以使用在应用程序配置文件中找到的<codeBase>元素。有关"通过代码库或者探测来定位程序集"的更多信息。

Well, the loaded assembly doesn't have
  an application configuration file.

好吧,如果我们知道运行时的特定文件夹,则可以使用Assembly.LoadFrom。