加载程序集及其依赖项
时间: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。