gpt4 book ai didi

c# - AppDomain 依赖解析顺序

转载 作者:太空狗 更新时间:2023-10-29 23:21:24 27 4
gpt4 key购买 nike

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

(root)\Library\AssemblyName\

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

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

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

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

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

最佳答案

总是优先。有几种解决方法:

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

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

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

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

关于c# - AppDomain 依赖解析顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33942899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com