.NET核心中没有AppDomain! 为什么?

微软select不支持.NET Core中的AppDomain是否有很强的理由?

在构build长时间运行的服务器应用程序时,AppDomain特别有用,我们可能希望更新由服务器加载的程序集,而不会closures服务器。

没有AppDomains,我们将如何在长时间运行的服务器进程中replace我们的程序集?

AppDomain也为我们提供了一种隔离服务器代码的不同部分的方法。 就像一个自定义websocket服务器可以在主appdomain中有套接字代码,而我们的服务在辅助appdomain中运行。

没有AppDomains,上面的情况是不可能的。

我可以看到一个论点,可能会谈论使用云的虚拟机概念处理程序集更改,而不必承担AppDomains的开销。 但这是微软认为还是说的? 或者他们有上述情况的特定原因和替代scheme?

.NETCore子集的意义在于保持.NET安装的小巧 。 并且易于移植。 这就是为什么您可以在Windows和OSX上运行Silverlight应用程序,而不是在访问网页时等待很长时间。 下载和安装完整的运行时和框架需要花费几秒钟的时间。

保持小尺寸不可避免地要求特征被削减。 这个清单上的Remoting非常高,价格相当昂贵。 否则很好隐藏,但是你可以看到代理不再有一个函数BeginInvoke()方法。 这也把AppDomain放在切割清单上,如果没有远程支持,你不能在应用程序域中运行代码。 所以这完全是由devise。

.NET Standard 2和.NET Core 2的更新

在.NET标准2中, AppDomain在那里。 但是,该API的许多部分将为.NET Core引发PlatformNotSupportedException

它仍然存在的主要原因是注册一个未处理的exception处理程序,这工作的基本东西。

.NET标准常见问题有这样的解释 :

.NET标准是AppDomain的一部分吗?

AppDomaintypes是.NET Standard的一部分。 并非所有平台都支持创build新的应用程序域,例如,.NET Core不会,所以在.NET Standard中可用的AppDomain.CreateDomain方法可能会抛出PlatformNotSupportedException。

我们在.NET标准中公开这种types的主要原因是因为使用率相当高,通常与创build新的应用程序域无关,而是与当前应用程序域进行交互,例如注册未处理的exception处理程序或询问应用程序的基本目录。

除此之外, 最好的答案和其他答案也很好地解释了为什么AppDomain的大部分仍然被削减(例如抛出一个不支持的exception)。

有一次,我听说卸载程序集将被启用,而不使用域。 我认为System.Runtime.Loader.AssemblyLoadContext中的System.Runtime.Loader.AssemblyLoadContexttypes与此工作有关,但是我没有看到任何可以卸载的东西。

我曾经听过一个社区站起来或者说一些微软的话说,AppDomain的隔离function更好地被进程处理(实际上是其他平台中的常见模式),并且卸载确实被规划为与AppDomain无关的普通function。

应用程序域

为什么中断? AppDomain需要运行时支持,而且通常相当昂贵。 虽然CoreCLR仍然在实施,但它在.NET Native中不可用,我们不打算在那里添加这个function。

我应该用什么来代替? AppDomain被用于不同的目的。 对于代码隔离,我们推荐进程和/或容器。 为了dynamic加载程序集,我们推荐使用新的AssemblyLoadContext类。

来自博客