2008-08-22 64 views
21

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

有没有办法告诉运行时,该DLL是在一个单独的子文件夹?

回答

18

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

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

然后在事件处理方法,你可以加载尝试使用Assembly.Load,Assembly.LoadFrom覆盖之一,从方法返回它来解决装配。

编辑:

您更多的信息基于我认为使用上述技术,专门解决一个组件引用自己是打算不重组你的应用程序工作的唯一真正的办法。它给你的是CLR未能解决的每个程序集的位置都可以在运行时由你的代码来确定和加载......我在类似的情况下对于可插入体系结构和程序集引用的完整性扫描工具。

+3

这种技术的一个很好的例子是应用程序LINQPad。它作为一个单独的exe文件发布,因此所有库都被包含为嵌入式资源。有关代码和http://www.linqpad.net/HowLINQPadWorks.aspx的信息,请参见http://www.albahari.com/nutshell/ch16.aspx。 – Pat 2012-07-20 20:45:36

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

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

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

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

+0

第一个链接提供“主题不再存在”。指定.NET 4.0提起这件事,但:[https://msdn.microsoft.com/en-us/library/15hyw9x3%28v=vs.100%29.aspx](https://msdn.microsoft.com/en -us /库/ 15hyw9x3%28V = VS.100%29.aspx) – AnorZaken 2016-02-01 17:17:51

相关问题