加载程序集及其依赖项

22

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

是否有一种方法告诉运行时dll位于单独的子文件夹中?

3个回答

19

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

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

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

编辑:

根据您提供的额外信息,我认为使用上述技术,特别是自己解析对程序集的引用,是不需要重新构建应用程序的唯一可行方法。它可以使您的代码在运行时确定并加载CLR无法解析的每个程序集的位置......我在类似的情况中使用过这种方法,既用于可插拔的架构,也用于一个程序集引用完整性扫描工具。


3
这种技术的一个很好的例子是应用程序LINQPad。它作为单个exe发行,所以所有库都作为嵌入资源包含在内。请参阅http://www.albahari.com/nutshell/ch16.aspx获取代码和http://www.linqpad.net/HowLINQPadWorks.aspx获取详细信息。 - Pat
我尝试过这种方法,但它会在反复请求相同程序集时出现 StackOverFlow 错误... - Patrick

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

1

第一个链接显示“主题不存在”。但是,指定 .Net 4.0 可以找到它:https://msdn.microsoft.com/zh-cn/library/15hyw9x3%28v=vs.100%29.aspx - AnorZaken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接