繁体   English   中英

AppDomain是否等同于.NET代码的进程?

[英]Is AppDomain equivalent to a Process for .NET code?

我必须调用一些写得不好的第三方COM组件,这些组件有内存泄漏,并在长时间运行的过程中使用Single Threaded Apartment [STA]。

我知道单独的进程将是实现它的好方法,我可以偶尔从长时间运行的进程重新启动它。

可以改用AppDomain吗? 如果适当标记,AppDomain线程是否为STA线程? 它是否有自己的COM对象内存? 卸载AppDomain是否相当于杀死进程?

AppDomain不提供与进程相同程度的隔离。 事实上,如果您担心第三方组件状况不佳,则存在风险,它会占用您的.NET应用程序。

如果在卸载时执行非托管代码,则无法卸载AppDomain,因此您可能很难在AppDomain中控制第三方代码。 请参阅http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx

即使仅对托管代码,AppDomain也不提供强大的沙盒解决方案。 例如,如果加载的代码产生任何线程,则这些线程将在未处理的异常情况下取消整个过程。 这个问题有更多信息: .NET - 实现“捕获所有异常处理程序”的最佳方法是什么

据我所知,在.NET应用程序中托管代码的最佳选择是实现自己的CLR主机进程,如IIS和SQL Server。

AppDomain (应用程序域)是应用程序执行的隔离环境。

它们有助于为执行托管代码提供隔离,卸载和安全边界。

  • 使用应用程序域来隔离可能导致进程崩溃的任务。 如果正在执行任务的AppDomain的状态变得不稳定,则可以卸载AppDomain而不会影响该进程。 当进程必须长时间运行而不重新启动时,这很重要。 您还可以使用应用程序域来隔离不应共享数据的任务。

  • 如果程序集已加载到默认应用程序域中,则在进程运行时无法从内存中卸载该程序集。 但是,如果打开第二个应用程序域以加载并执行程序集,则卸载该应用程序域时将卸载该程序集。 使用此技术可以最小化偶尔使用大型DLL的长时间运行进程的工作集。

多个应用程序域可以在单个进程中运行; 但是,应用程序域和线程之间没有一对一的关联。 多个线程可以属于单个应用程序域,并且虽然给定线程不限于单个应用程序域,但在任何给定时间,线程都在单个应用程序域中执行。

那些可能感兴趣的问题:

我不会自称是AppDomains领域的专家,但我很确定通过卸载AppDomain不会释放COM对象泄漏内存(即非托管内存)。 也许更熟悉这一点的人可以发表评论。

正如Brian指出的那样,“...在.NET Framework 2.0版域中无法保证卸载,因为它可能无法终止执行线程。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM