63

例如,在查看 GlowCode 分析器网站时,它会说:

“GlowCode 6.2 和 x64 配置本机、托管和混合 C++、C#、.NET 代码”

他们的意思是什么?

4

4 回答 4

89

本机代码是内存不是“托管”的代码,例如,内存没有为您释放(例如 C++ 的删除和 C 的空闲),没有引用计数,没有垃圾收集。你猜对了,托管代码是内存空闲并为你分配的代码,垃圾收集和其他好东西。

混合代码是指您拥有调用非托管层的托管代码。通常,当您有一个纯非托管 C++ DLL 并使用 P/invoke 从 .NET 调用它时。

于 2009-05-13T02:23:01.477 回答
54

本机代码被编译为直接与操作系统一起使用。然而,托管代码是预编译的(Java 语言中的字节码),然后在运行时由即时编译器处理为本机代码。托管代码有一个有趣的副作用,即有可能在不同的操作系统上运行,因为机器代码在虚拟机实际使用它之前不会创建。这样,您就可以在 Windows 上运行 .NET 应用程序,也可以在安装了 Mono 运行时的 Linux 或 Mac 上运行它们。可移植性目前不像 Java 那样干净(因为微软的自然封闭架构),但这个概念仍然存在。

如果您正在运行非托管应用程序,则代码已编译为针对指定的操作系统/硬件运行。任何到另一个操作系统/指令集的可移植性都会丢失,必须重新编译才能执行。

于 2009-05-13T02:33:41.533 回答
40

本机代码是用运行它的计算机的“本机”机器语言编写的,并由处理器直接执行。

托管代码是用一种特殊的语言编写的,需要另一个程序来运行(即管理)它。这个其他程序通常被称为解释器,因为它解释了特殊语言。

C 和 C++ 程序是本机程序。

Java 和 C#(以及与此相关的所有 .NET 语言)都受到管理。

托管 C++ 是在 .NET 解释器中运行的一种特殊形式的 C++。

混合程序是使用本机和托管代码的程序。

于 2009-05-13T22:27:28.573 回答
10

在公共语言运行时 (CLR) 控制下运行的代码称为托管代码。不在 CLR 下运行的代码称为本机代码。

于 2013-06-10T13:03:35.143 回答