C#托管代码与非托管代码

了解C#.NET应用程序中的托管代码和非托管代码

当我们使用VisualStudio并使用任何支持DotNet的编程语言(如 C#、VB 等)在DotNet中创建任何exe(即控制台应用程序、窗口应用程序、类库项目等)或 Web 应用程序(即 ASP.NET MVC、Web API、ASP.NET 等)时,
这些应用程序完全在 CLR(通用语言运行时)的控制之下运行。

这意味着,如果应用程序具有未使用的对象,则 CLR 将使用垃圾回收器清理这些对象。如果应用程序想要与其他应用程序通信,则它请确保 CTS(通用类型系统)可用。
如果应用程序具有适当的执行权限,CLR 将使用 CAS(代码访问安全性)。CLR 将加载您的应用程序并卸载应用程序等。因此,为了更好的理解,如下图所示。

现在,假设在DotNet应用程序中使用了其他第三方 exe,如 Skype、PowerPoint、Microsoft Excel 等。
这些 exe 不是在DotNet中制造的,它们使用其他编程语言(如 C、C++等)。

在应用程序中使用这些 exe 时,这些 exe 不会由 CLR 运行。即使您在点网络应用程序中运行这些 exe,它们也要在他们自己的环境中运行。
例如,如果使用 C 或 C++开发 exe,则该 exe 将在运行时环境中的 C C++下运行。在同一行中,如果使用 VB6 创建 exe,则它将在 VB6 运行时环境中运行。

.NET中托管和未托管的代码到底是什么?

在 CLR 完全控制下运行的代码在 .NET 中称为托管代码。
这些类型的代码(C# 中的托管代码)由点网络运行时环境运行。
如果未安装点网框架,或者点网运行时不可用,则不会执行这些类型的代码。
CLR 将为托管代码执行提供 .NET 的所有设施和功能,如语言互操作性、自动内存管理、异常处理机制、代码访问安全性等。

另一方面,Skype,PowerPoint,MicrosoftExcel不需要点网络运行时,它们在他们自己的环境中运行。
因此,简言之,不在 CLR 控制下运行的代码(exe,Web app)在 .NET 中称为非托管代码。
CLR 不会向 C# 执行中的非托管代码提供任何 .NET 的功能和功能,如语言互操作性、自动内存管理、异常处理机制、代码访问安全性等。

原文地址:https://www.cnblogs.com/zh7791/p/13704928.html