AppDomain依赖关系解析顺序

时间:2015-11-26 16:07:16

标签: c# .net reflection

我有一个类似于调度程序的.Net多应用程序域应用程序。默认应用程序域有一个计时器和一个包含在其自己的程序集中的作业列表,并在单独的应用程序域上运行。包含作业的程序集分别保存在应用程序根目录下的单独目录中。

(root)\Library\AssemblyName\

每个程序集目录都包含程序集及其依赖项。其中一些依赖项(例如log4net)也包含在根目录中,因为默认域具有单独的日志。我想从程序集目录加载作业程序集及其依赖项(如果它们存在),如果不是,我想从应用程序根目录加载它们。主appdomain和子域都使用相同的库,其接口类似于Quartz的IJob接口,因此需要从同一个文件加载此程序集。

这个相当奇怪的要求的原因是应用程序作业应该具有自动更新能力。因此,专门设计的类将从API下载作业,卸载作业所在的appdomain,删除具有所有依赖项的作业程序集并重新加载appdomain并重新启动作业,而不会干扰其他作业操作。我已经尝试使用AppdomainSetup在根目录

之前设置Assembly目录
domainSetup.PrivateBinPath = @"\\Library\\AssemblyName\\" 

但每次都会从根目录中解析我的依赖项。

所以基本上我希望我的依赖从...解决 1.如果可能,装配文件夹 2.根目录

1 个答案:

答案 0 :(得分:4)

Root 始终优先。有几种解决方法:

确保根目录实际上没有任何引用 - 将主域的基本目录放入另一个子目录而不是根目录。

或者,充分利用域设置中的ApplicationBase(即更改根目录,而不是私有bin路径)

或者,使用PrivateBinPathProbe来防止从根目录加载任何程序集。

或者,设置DisallowApplicationBaseProbing并实施AppDomain.AssemblyResolve事件 - 这使您可以手动控制域中的所有程序集分辨率。这可能是你真正想要的那个,尽管我将它与基础域结合起来只是另一个"模块"同样。