如何强制我的可执行文件从不同的路径加载程序集?

时间:2013-06-27 18:42:58

标签: c# .net .net-assembly assembly-resolution

我有以下部署结构:

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。

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\"