我有以下部署结构:
deployment/
Service1.dll
Service2.dll
Service3.dll
Common.dll
Host.exe
在启动期间,3个服务dll被复制到临时位置,我使用Assembly.LoadFrom
以这种方式显式加载它们。我的代码在deployment
中查找更改,并且因为这些程序集已加载到它们自己的AppDomain中,所以我可以关闭它们,复制新版本,然后重新启动它们。这很有效。
我遇到的问题是所有这3项服务都依赖于Common.dll
(主要主机可执行文件不是)。在启动期间,这个常见的dll 也被复制到临时位置,但主机正在解析deployment
而不是我临时位置的那个。
我已尝试使用AppDomainSetup.PrivateBinPath
并将其指向我的临时位置,但它仍在解析到部署文件夹中的位置。
我是否有某种方法可以强制CLR在我的临时文件夹首先中查找之前尝试在部署文件夹中解析它(其中有其他依赖项,但没有我需要“阴影” “,就像它一样。”
编辑:为了澄清,如果common.dll
被修改, all 首先卸载服务,以便在复制之前释放对公共dll的依赖,然后重新启动所有3。
答案 0 :(得分:1)
最后,我使用AssemblyResolve
事件和当前进程目录解决了这个问题:
AppDomainSetup domainSetup = new AppDomainSetup()
{
ApplicationBase = _config.ShadowPath
};
AppDomain domain = AppDomain.CreateDomain(available.Description.ShortName, null, domainSetup);
domain.AssemblyResolve += (source, args) =>
{
int comma = args.Name.IndexOf(',');
string path = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().Modules[0].FileName), args.Name.Substring(0, comma) + ".dll");
return Assembly.LoadFrom(path);
};
答案 1 :(得分:0)
听起来问题是,在您复制时CLR已经加载了common.dll。某些其他程序集中是否有类型的静态成员引用common.dll中的类型?
答案 2 :(得分:0)
设置AppDomain时,您尝试设置ApplicationBase
例如appDomain.SetupInformation.ApplicationBase = @"C:\ShadowCopyTest\"