-1

我有以下部署结构:

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 先查看我的临时文件夹然后再尝试在部署文件夹中解决它(那里有其他依赖项,但没有我需要“隐藏”的,因为它是)。

EDIT: For clarification, if common.dll is modified, all the services are unloaded first to release the dependency on the common dll before copying and then restarting all 3.

4

3 回答 3

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);
                        };
于 2013-08-01T13:07:03.250 回答
0

当您设置 AppDomain 时,您是否尝试过设置ApplicationBase , 例如appDomain.SetupInformation.ApplicationBase = @"C:\ShadowCopyTest\"

于 2013-06-27T23:17:26.730 回答
0

听起来问题是在您制作副本时,CLR 已经加载了 common.dll。其他程序集中是否存在引用 common.dll 中的类型的类型的静态成员?

于 2013-06-27T19:20:00.580 回答