编程中的托管代码和非托管代码是什么?

177

我在我的C#代码中使用了一个特定的命令,它运行良好。然而,据说它在“非托管”代码中表现不佳。

什么是托管或非托管代码?


13个回答

1

托管代码:编译器编译后生成的中间语言(MSIL)形式的代码,由CLR直接执行,称为托管代码。 例如:.net框架支持的所有61种语言代码。

非托管代码:在.net之前开发的代码,其MSIL形式不可用,并且由CLR直接执行,而CLR将重定向到操作系统,这被称为非托管代码。 例如:COM、Win32 API。


这篇文章中有许多错误。其中一个最明显的是MISL(应该是MSIL)。 - Matt Seymour

0
首先要了解的是,在.NET框架之前,微软提供的是独立产品,如MFC(Visual C++)、VB、FoxPro等。
在2002年,微软将其产品合并,并制作了.NET框架。现在,在代码执行之前和在.NET框架中管理和执行代码之间存在差异。微软引入了CLR概念,它可以编译来自.NET框架支持的任何语言的代码,并提供额外的功能,如内存管理、垃圾回收等。但是,在此之前并没有直接提供这样的CLR功能。
因此,如果您在.NET框架中创建库/代码(使用CLR编译),那么称为“托管代码”。您可以在其他.NET应用程序/项目中进一步使用此库,CLR也会理解它以前是如何编译的,因此它仍然是您的托管代码。

另一方面,如果您想使用在 .NET 框架之前编写的库,则可以使用某些限制,但请记住,由于 CLR 当时还不存在,所以现在 CLR 将无法理解并重新编译此代码。这将被称为 非托管代码。请注意,由第三方创建的用于提供某些功能/工具的库/程序集也可能被视为不兼容 CLR 的非托管代码。

通俗来讲,托管代码 是指您的 CLR 可以理解并可以自行编译以进行进一步执行的内容。在 .NET 框架中(从任何适用于 .NET 框架的语言),当代码传递到 CLR 时,代码会提供一些元数据信息,以便 CLR 可以为您提供 此处 指定的功能。其中一些功能包括垃圾回收、性能改进、跨语言集成、内存管理等。

另一方面,非托管代码是机器特定的,可以直接使用,无需进一步处理。


很遗憾,这里有许多不知情的观点。这可能会让人感到惊讶,但CLR也可以执行非托管代码(通常是用C++/CLI编写的)。托管代码无需作为IL可用的要求。.NET Native已经存在一段时间了,并且它带有预编译的程序集。你所说的“CLR兼容”可能意味着“CLS兼容”。未能满足CLS兼容性并不会突然使托管代码变成非托管代码。尽管你的描述有些不准确,但消费非托管代码也很容易(通过COM的RCW、P/Invoke、C++/CLI等)。 - IInspectable

0

来自Pro C# 5和.NET 4.5框架:

托管代码与非托管代码: 关于C#语言最重要的一点可能是理解它只能生成在.NET运行时内执行的代码(您永远不能使用C#构建本机COM服务器或非托管的C/C++应用程序)。正式地说,用于描述针对.NET运行时的代码的术语是托管代码。 包含托管代码的二进制单元称为程序集(稍后将详细介绍有关程序集的更多详细信息)。 相反,无法直接由.NET运行时托管的代码称为非托管代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接