2010-10-13 73 views
2

有沒有辦法釋放使用後期綁定訪問的對象(即由Activator.CreateInstance()方法創建)?C中發佈後期綁定對象#

我有一個應用程序將文件從一種格式轉換爲另一種格式。執行這些翻譯的程序集位於我的應用程序目錄中的文件夾中。

當應用程序首次啓動時,我可以從翻譯文件夾中刪除這些程序集而不會出現任何錯誤。但是,一旦我通過應用程序處理文檔(並且使用後期綁定綁定到其中一個翻譯程序集),我就不能再刪除翻譯程序集。此時,我收到一條錯誤消息,指出該文件正在被另一個應用程序使用。

有沒有辦法在應用程序中「釋放」後期綁定的對象?

+0

可能重複[C# - 加載.NET程序集到單獨的AppDomain這樣你就可以卸載它(HTTP:// stackoverflow.com/questions/1228554/c-loading-net-assembly-into-seperate-appdomain-so-you-can-unload-it) – 2010-10-13 16:17:22

回答

1

一旦組件加載到應用程序域,它會保持直到應用程序域關閉。

爲了解決這個負載裝配到它自己的應用領域,例如:

AppDomain app = AppDomain.CreateDomain("PlugInDomain"); 
ObjectHandle objectHandle = app.CreateInstanceFrom(assemblyPath, 
      "MyNamespace.MyComponent"); 
MyComponent component = (MyComponent) objectHandle.Unwrap(); 

// do stuff 

// Now kill app domain, assembly can be overwritten after this. 
AppDomain.Unload(app); 
+0

完美!謝謝Kev! – pmartin 2010-10-13 16:58:54

0

將程序集加載到正在執行的AppDomain中後,它不能被卸載(無論它是否通過使用Activator.CreateInstance的反射來創建)。

這裏推薦的方法是實現一個輔助AppDomain,該輔助AppDomain的生命週期可以在需要處置程序集時卸載。

有很多的例子,但這裏是一個: http://www.dotnet247.com/247reference/msgs/28/142174.aspx

由於管理輔助AppDomain的生命週期可能很痛苦,所以如果您正在使用ASP .NET並希望加載許多動態程序集,則可以通過以下方式檢查當前AppDomain是否已通過動態加載的程序集飽和結合AppDomain.CurrentDomain.AssemblyLoaded事件,並保持計數,然後請求主機環境回收當前的AppDomain當它擊中像一個臨界值(500說):

HostingEnvironment.InitiateShutdown();