例如,在查看 GlowCode 分析器网站时,它会说:
“GlowCode 6.2 和 x64 配置本机、托管和混合 C++、C#、.NET 代码”
他们的意思是什么?
本机代码是内存不是“托管”的代码,例如,内存没有为您释放(例如 C++ 的删除和 C 的空闲),没有引用计数,没有垃圾收集。你猜对了,托管代码是内存空闲并为你分配的代码,垃圾收集和其他好东西。
混合代码是指您拥有调用非托管层的托管代码。通常,当您有一个纯非托管 C++ DLL 并使用 P/invoke 从 .NET 调用它时。
本机代码被编译为直接与操作系统一起使用。然而,托管代码是预编译的(Java 语言中的字节码),然后在运行时由即时编译器处理为本机代码。托管代码有一个有趣的副作用,即有可能在不同的操作系统上运行,因为机器代码在虚拟机实际使用它之前不会创建。这样,您就可以在 Windows 上运行 .NET 应用程序,也可以在安装了 Mono 运行时的 Linux 或 Mac 上运行它们。可移植性目前不像 Java 那样干净(因为微软的自然封闭架构),但这个概念仍然存在。
如果您正在运行非托管应用程序,则代码已编译为针对指定的操作系统/硬件运行。任何到另一个操作系统/指令集的可移植性都会丢失,必须重新编译才能执行。
本机代码是用运行它的计算机的“本机”机器语言编写的,并由处理器直接执行。
托管代码是用一种特殊的语言编写的,需要另一个程序来运行(即管理)它。这个其他程序通常被称为解释器,因为它解释了特殊语言。
C 和 C++ 程序是本机程序。
Java 和 C#(以及与此相关的所有 .NET 语言)都受到管理。
托管 C++ 是在 .NET 解释器中运行的一种特殊形式的 C++。
混合程序是使用本机和托管代码的程序。
在公共语言运行时 (CLR) 控制下运行的代码称为托管代码。不在 CLR 下运行的代码称为本机代码。