.NET进程内和进程外托管代码有什么区别?

 .NET还有进程内和进程外托管代码之分?小编也是第一次听到同事面试中被问到。在.NET中,托管代码是在托管环境下执行的代码,它受到.NET运行时CLR的管理,进程内和进程外托管代码是两种不同的运行方式。本文将简介这两者的关系。

1、进程内托管代码

进程内托管代码(In-Process Managed Code)是指在与主应用程序在同一进程中执行的托管代码。它与应用程序共享相同的进程空间,共享内存和资源,由于共享关系因此它们之间的通信更加高效。.

特点:

1) 直接访问应用程序的内存和资源,无需额外的通信机制。

2)具有更快的方法调用和资源访问速度,因为无需跨进程通信。

缺点:

    由于进程内托管代码与主应用程序运行在同一进程中,如果托管代码出现问题,可能会导致整个应用程序崩溃。

使用场景:

    单体应用,比如功能单一的企业站点等。自 ASP.NET Core 3.0 起,默认情况下已为部署到 IIS 的所有应用启用进程内托管。

2. 进程外托管代码

进程外托管代码(Out-of-Process Managed Code)是指在与主应用程序分离的独立进程中执行的托管代码。它们通过进程间通信机制与应用程序进行通信。
特点:
1)进程外托管代码运行在独立的进程中,与主应用程序隔离,即使托管代码崩溃,主应用程序也不会受到影响。
2)可以使用不同的语言和技术来编写进程外托管代码,使得应用程序可以利用多种技术栈的优势。
缺点: 由于进程间通信的开销,进程外托管代码的方法调用和资源访问速度相对较慢。
使用场景:
    进程外托管代码适用于需要高度隔离和可扩展性的场景,如多租户应用程序、微服务架构等。.NET Core这时候可以使用Kestrel 服务器,当天IIS也可以配置进程外的托管代码。
3、结语:
    希望本文对您理解进程内和进程外托管代码的区别有所帮助。对于进程内和进程外托管代码的区别还有什么疑问,欢迎留言讨论或吐槽。
参考:
https://learn.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/in-process-hosting?view=aspnetcore-7.0