我的应用程序在运行时从特定子文件夹动态加载程序集。这些程序集编译时依赖于其他程序集。运行时尝试从应用程序目录加载这些内容。但我想将它们放入模块目录。
有没有办法告诉运行时dll是在一个单独的子文件夹中?
答案 0 :(得分:18)
我最近使用的一个很好的方法是为AppDomain的AssemblyResolve事件添加一个事件处理程序。
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
然后在事件处理程序方法中,您可以加载试图使用Assembly.Load,Assembly.LoadFrom之一覆盖的程序集,并从方法返回它。
编辑:
基于您的其他信息,我认为使用上述技术,特别是自己解决对程序集的引用是唯一可以在不重新构建应用程序的情况下工作的真正方法。它给你的是CLR无法解决的每个程序集的位置可以在运行时由代码确定和加载...我在类似的情况下使用它来实现可插拔体系结构和程序集参考完整性扫描工具。
答案 1 :(得分:4)
您可以使用清单文件中的<probing>
元素告诉Runtime查看其汇编文件的不同目录。
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
e.g:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
答案 2 :(得分:1)
您可以使用应用程序配置文件中的<codeBase>
元素。有关“Locating the Assembly through Codebases or Probing”的更多信息。
好吧,加载的程序集没有 应用程序配置文件。
如果您在运行时知道特定文件夹,则可以使用Assembly.LoadFrom。