Iva*_*lik 5 .net c# reflection
我有一个类似于调度程序的.Net多应用程序域应用程序。默认应用程序域具有一个计时器和一个作业列表,每个作业都包含在其自己的程序集中并在单独的应用程序域上运行。包含作业的程序集每个都保存在应用程序根目录下的单独目录中。
(root)\Library\AssemblyName\
Run Code Online (Sandbox Code Playgroud)
每个程序集目录都包含程序集及其依赖项。某些依赖项(例如log4net)也包含在根目录中,因为默认域具有单独的日志。我想从程序集目录中加载作业程序集及其依赖项(如果不存在),如果不存在,我想从应用程序根目录中加载它们。主应用程序域和子域都使用与Quartz的IJob接口类似的相同接口库,因此需要从同一文件加载该程序集。
之所以提出此要求很奇怪,是因为应用程序作业应具有自动更新功能。因此,专门设计的类将从API中下载作业,卸载作业所在的应用程序域,删除具有所有依赖项的作业程序集,然后重新加载应用程序域并重新启动作业,而不会干扰其他作业操作。我尝试使用AppdomainSetup在根目录之前设置Assembly目录,
domainSetup.PrivateBinPath = @"\\Library\\AssemblyName\\"
Run Code Online (Sandbox Code Playgroud)
但是我的依赖关系每次都会从根目录中解决。
所以基本上我希望我的依赖关系从1. Assembly文件夹中解决(如果可能)2.根目录
永远扎根优先。有几种方法可以解决这个问题:
只需确保根目录实际上没有任何引用 - 将主域的基目录放入另一个子目录而不是根目录中。
或者,充分利用ApplicationBase域内设置(即更改根目录,而不是私有 bin 路径)
或者,使用PrivateBinPathProbe防止从根加载任何程序集。
或者,设置DisallowApplicationBaseProbing并实现AppDomain.AssemblyResolve事件 - 这使您可以手动控制域中的所有程序集解析。这可能是您真正想要的,尽管我会将其与使基域也成为另一个“模块”结合起来。