托管和非托管代码、内存和大小有什么区别?

在看到和听了很多关于托管和非托管代码的内容之后,我知道了托管代码与非托管代码的唯一区别是,托管代码是关于 CLR 的,而非托管代码是 CLR 之外的,这让我非常好奇想要详细了解它。它是关于什么的,托管和非托管代码、内存和大小?

我用 C # 编写的代码如何能够非托管,而这是 C # 代码,以及一个大小的内存是如何变得非托管的。一个例子和一点点见解会很有帮助。

71675 次浏览

通常的托管代码比等效的编写良好的非托管(本机)代码具有更高的运行时内存占用。

简短的回答:

  • 托管代码 是您编写并编译到.NET CIL的.NET 代码(VB.NET,C # 等)。
  • 非托管代码 是不在.NET 下编译为指导计算机代码的代码。

长话短说:

什么是托管代码?

托管代码是什么 VisualBasic。NET 和 C # 编译器创建。它编译成中间语言(IL) ,而不是可以直接在计算机上运行的机器代码。CIL 保存在一个称为程序集的文件中,以及描述所创建代码的类、方法和属性(如安全需求)的元数据。中的一站式部署单元。网络世界。您可以将其复制到另一台服务器,以便在那里部署程序集,而复制通常是部署过程中唯一需要的步骤。

托管代码在通用语言运行库中运行。运行库为运行代码提供各种各样的服务。在通常的事件过程中,它首先加载并验证程序集,以确保 CIL 是正常的。然后,正当方法被调用时,运行时安排将它们编译成适合运行程序集的机器的机器代码,并缓存这些机器代码,以便下次调用方法时使用。(这被称为 Just In Time,或 JIT 编译,或者常常只是 Jiting。)

在程序集运行时,运行库继续提供安全性、内存管理、线程等服务。应用程序由运行库管理。

VisualBasic.NET 和 C # 只能生成托管代码。如果您正在使用这些应用程序,那么您正在编写托管代码。Visual C + + .NET 可以产生托管代码,如果您喜欢: 当您创建一个项目,选择其名称开头的应用程序类型之一。管理,例如。管理的 C + + 应用程序。.

什么是非托管代码?

非托管代码是在 VisualStudio 之前使用的代码。NET 2002发布。Visual Basic 6,Visual C + + 6,见鬼,甚至那个你可能还在硬盘上闲逛的有15年历史的 C 编译器都生成了非托管代码。它直接编译成运行在您编译它的机器上的机器代码,也可以在其他机器上编译,只要它们有相同的芯片,或者几乎相同。它不是从不可见的运行时获得安全或内存管理等服务,而是从操作系统获得这些服务。而且重要的是,它显式地从操作系统中获取它们,通常是通过调用 WindowsSDK 中提供的 API。最近的非托管应用程序通过 COM 调用获得操作系统服务。

与 VisualStudio 中的其他 Microsoft 语言不同,VisualC + + 可以创建非托管应用程序。当您创建一个项目并选择一个名称以 MFC、 ATL 或 Win32开头的应用程序类型时,您正在创建一个非托管应用程序。

这可能会导致一些混淆: 当您创建一个。管理的 C + + 应用程序,生成产品是 CIL 与。外部扩展。创建 MFC 应用程序时,生成产品是一个本机代码的 Windows 可执行文件,还带有。外部扩展。这两个文件的内部布局完全不同。您可以使用中间语言反汇编程序 ildasm 来查看程序集内部,并查看元数据和 CIL。试着把 ildasm 指向一个非托管的 exe,你会被告知它没有有效的 CLR (通用语言运行库)头文件,不能被分解ーー同样的扩展名,完全不同的文件。

《原住民法典》怎么样?

短语本机代码在两个上下文中使用。许多人将它作为非托管代码的同义词: 使用旧工具生成的代码,或者在 Visual C + + 中特意选择的代码,这些代码不在运行时运行,而是在机器上本机运行。这可能是一个完整的应用程序,也可能是一个使用 COM Interop 或 PInvoke 从托管代码调用的 COM 组件或 DLL,这两个强大的工具可以确保您在迁移到新世界时可以使用旧代码。我更愿意说。非托管代码。因为它强调代码不能获得运行时的服务。例如,托管代码中的代码访问安全性阻止从其他服务器加载的代码执行某些破坏性操作。如果应用程序调用从其他服务器加载的非托管代码,则不会得到这种保护。

短语本机代码的另一个用法是描述 JIT 编译器的输出,即实际在运行时中运行的机器代码。是管理的,但不是 CIL 是机器代码。因此,不要仅仅假设本机 = 非托管。

(来源)

这可能是一个很长的答案,谈到 C 编译器生成的机器代码与从托管程序生成的 JIT 编译器生成的机器代码之间的许多细微差别。长到足以真正需要一本书,但这样的书已经写完了。比如 Jeffrey Richter 的任何作品。

我会尽量简洁明了,因为所有这些细微的差别都可以归结为一个原则:

托管代码是从垃圾回收堆分配内存的代码。

托管代码在应用程序域中运行,非托管代码在操作系统进程下运行。

直接在操作系统下运行的应用程序称为

非托管应用程序

而在.net 框架下运行的应用程序被称为

管理应用程序

非托管代码:-

1. 在.NET,Framework 之外开发的代码称为非托管代码。

2.不在 CLR 控制下运行的应用程序被称为非托管应用程序,某些语言(如 C + +)可以用来编写这样的应用程序,例如,访问操作系统的低级函数。与 VB、 ASP 和 COM 代码的后台兼容是非托管代码的例子。

3. 在包装类的帮助下执行非托管代码。

4. 包装类有两种类型: CCW (COM 可调用包装)和 RCW (运行时可调用包装)。

5. 在《特定常规武器公约》和《特定常规武器公约》的帮助下,使用包装纸来覆盖差异。 托管代码 应用程序域中的资源是托管代码。域中的资源运行速度更快。

托管代码 1. 在.NET 框架中开发的代码称为托管代码。 CLR 在托管代码执行的帮助下直接执行此代码。任何文字。NETFramework 是托管代码。

2.托管代码使用 CLR,CLR 依次通过管理内存、处理安全性、允许跨语言调试等来照看应用程序。