2013-06-27 93 views
-1

我有以下部署結構:如何強制我的可執行文件從不同的路徑加載程序集?

deployment/ 
    Service1.dll 
    Service2.dll 
    Service3.dll 
    Common.dll 
    Host.exe 

在啓動過程中,3倍服務的DLL被複制到一個臨時位置,我用Assembly.LoadFrom明確載入他們的方式。我的代碼查找deployment中的更改,並且因爲這些程序集已加載到它們自己的AppDomain中,所以我可以將它們關閉,複製新版本並再次啓動它們。這很好。

我遇到的問題是,所有這些服務都依賴於Common.dll(主要可執行文件而不是)。在啓動過程中,這個常見的dll是也被複製到臨時位置,但主機正在解析deployment中的一個,而不是在我的臨時位置。

我試過使用AppDomainSetup.PrivateBinPath並將其指向我的臨時位置,但它仍然解析爲部署文件夾中的一個。

有沒有一些方法,我可以強制CLR在我的臨時文件夾中查找第一試圖解決它在部署文件夾(如果有其他依賴,但在此之前沒有,我需要的「影子」,因爲它人)。

編輯:爲了澄清,如果common.dll被修改,所有服務首先卸載釋放複製,然後重新啓動所有3

+0

可以嘗試使用裝配解決事件: [解析程序集引用從另一個文件夾(HTTP:// stackoverflow.com/questions/5260404/resolve-assembly-references-from-another-folder?rq=1) – mungflesh

+0

@mungflesh,我的印象是,如果事件無法找到組件,就會引發事件......並且我的情況,它可以 - 只是不是我想要的:) –

回答

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); 
         }; 
0

這聽起來面前的共同的DLL的依賴一樣,問題是常見CLR在您複製時已經加載.dll。在某些其他程序集中是否存在引用common.dll中某個類型的靜態成員?

+0

主機可執行文件對它沒有依賴性,並且在任何加載3個服務程序集之前發生「遮蔽」問題。現在,'Common.dll' *確實取決於Host.exe加載的程序集,但是它在主機啓動時不加載(因爲主機不依賴它 - 甚至不知道它存在)。 –

0

當您設置您的AppDomain時,您是否嘗試過設置ApplicationBase appDomain.SetupInformation.ApplicationBase = @"C:\ShadowCopyTest\"

+0

還沒有嘗試過,但會做。這將如何影響部署文件夾中未映射的其他依賴項,或者是否有「全部或全部」方法? –

+0

應用程序域中的所有內容都將受到appbase的影響,但您可以在該方案中使用AppDomain.AssemblyResolve事件。 – Plymouth223

相關問題