![](/img/trans.png)
[英]Adding late-bound information to an object in C#, using dynamic keyword?
[英]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.