AppDomain依赖项解析顺序

本文关键字:顺序 依赖 AppDomain | 更新日期: 2023-09-27 18:24:48

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

(root)'Library'AssemblyName'

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

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

domainSetup.PrivateBinPath = @"''Library''AssemblyName''" 

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

所以基本上,我希望我的依赖性能够从1.组装文件夹(如果可能)2.根目录

AppDomain依赖项解析顺序

Root始终优先。有几种方法可以解决这个问题:

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

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

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

或者,设置DisallowApplicationBaseProbing并实现AppDomain.AssemblyResolve事件-这使您可以手动控制域中的所有程序集解析。这可能是真正想要的,尽管我也会将其与使基域成为另一个"模块"结合起来。