public class IsolateCollect : Disposable { private AppDomain _domain; public IsolateCollect(AppDomain domain) { _domain = domain; } protected override void DisposeInternal(bool disposing) { if (_domain.IsFinalizingForUnload()) { return; } try { AppDomain.Unload(_domain); } catch (Exception ex) { App.LogError(ex, "IsolateCollect"); } } }
public static string IsolateCallV1(PageContentHandler pHandler) { string name = Guid.NewGuid().ToString("N"); var domain = AppDomain.CreateDomain(name); try { var proxy = domain.CreateInstanceAndUnwrap("xx","xx"); string ret = (string)proxy.DoEntry(pHandler); if (ret == null) { throw new InvalidOperationException(); } return ret; } finally { //AppDomain不能即时卸载?不能在IDisposable中卸载? //App.LogInfo("IsolateCollect Unload {0}@{1}", domain.FriendlyName, AppDomain.CurrentDomain.FriendlyName); //AppDomain.Unload(domain); new JobTimer(state => { try { var d = (AppDomain)state; //if (d.IsFinalizingForUnload()) //{ // return; //} App.LogInfo("IsolateCollect Unload {0}", d.FriendlyName); AppDomain.Unload(d); } catch (Exception ex) { App.LogError(ex, "IsolateCollect"); } }, DateTime.Now.AddSeconds(20d)).Start(domain); } }
20秒后卸载正常,求解~
尝试卸载下列对象时引发的 CannotUnloadAppDomainException:
默认应用程序域,该域在应用程序的生存期内必须保持加载状态。
包含无法立即停止执行的运行线程的应用程序域。
已经被卸载的应用程序域。