簡體   English   中英

在C#中釋放后期綁定對象

[英]Release Late-Bound Object in C#

有沒有辦法釋放使用后期綁定訪問的對象(即由Activator.CreateInstance()方法創建的對象)?

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

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

一旦使用完畢,是否可以在應用程序中“釋放”后期綁定的對象?

將程序集加載到應用程序域后,它將一直保留到應用程序域關閉為止。

要解決此問題,請將該程序集加載到其自己的應用程序域中,例如:

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

程序集一旦加載到執行的AppDomain中,就無法卸載(無論它是否通過Activator.CreateInstance通過反射創建)。

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

有很多示例,但這里有一個示例: http : //www.dotnet247.com/247reference/msgs/28/142174.aspx

由於管理輔助AppDomain的生存期可能很麻煩,因此,如果您正在使用ASP .NET並希望加載許多動態程序集,則可以通過綁定到AppDomain.CurrentDomain.AssemblyLoaded來檢查當前的AppDomain何時被動態加載的程序集飽和AppDomain.CurrentDomain.AssemblyLoaded事件並保持計數,然后請求托管環境在其達到關鍵數字(例如500)時回收當前AppDomain,例如:

HostingEnvironment.InitiateShutdown();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM