2012-09-18 120 views
0

我有一個mvc3應用程序。 我在我的應用程序項目中有一個名爲「插件」的子文件夾無法在新的應用程序域中加載程序集

存儲在該文件夾中的所有dll應該在運行時更新,所以我們放下appdomain並重新加載新版本的dll,試圖加載所有的插件DLL在不同的AppDomain中,並設置它的shadowCopy屬性。

通過SO,msdn和一些博客,我得到了這個「解決方案」。 (這在我的Application_Start期間被調用)

static AppDomain pluginDomain; 
static PluginHolder() 
     { 
      AppDomainSetup domainSetup = AppDomain.CurrentDomain.SetupInformation; 
      domainSetup.ApplicationName = "Plugins"; 
      domainSetup.PrivateBinPathProbe = domainSetup.PrivateBinPath; 
      domainSetup.PrivateBinPath = GetPluginsDirectory(); 
      domainSetup.ShadowCopyFiles = "true"; 
      domainSetup.ShadowCopyDirectories = domainSetup.PrivateBinPath; 

      pluginDomain= AppDomain.CreateDomain("Plugins", null, domainSetup); 
      var item = pluginDomain.Load(File.ReadAllBytes(GetPluginsDirectory() + "Item.dll")); 
     } 

「Item.dll」是我正在嘗試加載的dll。最後一行引發「無法加載文件或程序集項目或其某個依賴項」。 這似乎是其他人成功的方式,但它不會爲我工作。

我以前沒有AppDomain的經驗,所以我不確定如何解決這個問題,或者如果我正確處理它。

我的程序集是通過新的AppDomain加載的嗎?

回答

0

要解密這些類型的錯誤消息,您應該使用Assembly Binding Log Viewer

關注AppDomain.Load(byte[])文檔頁面的備註部分。如果要在新的AppDomain上加載程序集,則應該使用CreateInstanceAndUnwrap代替。

如果你想在.NET中實現一個插件引擎,那麼你需要了解AppDomain,程序集的解析和加載,然後選擇不同AppDomain中的對象之間的通信機制。 .NET和CLR上的大多數優秀書籍都包含AppDomains上的一兩章內容,它們將幫助您加快步伐。現在就跨域AppDomain通信而言,您可以使用WCF或.NET Remoting(MarshalByRefObject)。

祝你好運。

相關問題