【问题标题】:Difference between native and managed code?本机代码和托管代码之间的区别?
【发布时间】:2010-10-25 17:46:03
【问题描述】:

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

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

它们是什么意思?

【问题讨论】:

标签: native managed


【解决方案1】:

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

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

【讨论】:

  • C++/CLI 编译器允许托管代码(使用/clr 编译并输出为 MSIL)在本机堆上分配本机对象(无垃圾回收)。此外,(桌面).NET 垃圾收集器不使用引用计数(存在循环问题)。
  • 我通过 Bing 找到了这个答案。比 MS 网站解释得更好。
  • 原生不意味着内存管理。本机意味着它是 Windows 应用程序或 dll。 .Net 也不创建。它使用与本机应用程序相同的文件扩展名,但这些 exe 和 dll 的内容不是 windows exe 和 dll 的内容。这就是为什么您不能将 .net “dll”与本机 Windows 应用程序一起使用,因为它不是 Windows dll。
  • 自动内存管理只是语言管理的一小部分。最重要的区别是本机代码将编译为二进制可执行文件,而托管代码将编译为字节码,该字节码必须在运行时由 Just In Time 编译器进行解释。 docs.microsoft.com/en-us/dotnet/standard/…
【解决方案2】:

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

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

【讨论】:

  • 请解释一下为什么“因为微软自然封闭的架构”,“目前可移植性不如Java干净”。我不明白为什么微软自然封闭的架构会限制 .NET 像 Java 一样的可移植性。
  • @pacerier 我今天对你的问题的回答与我六年前给出的答案不同。例如,六年前.NET 不是开源的。但是最近发布的公告在这方面改变了一切,不是吗? :)
  • 另外重要的是要指出非本地无法与本地集成。例如,您无法使用 .net 创建 isapi 应用程序,因为它不会创建 windows dll,或者您无法使用 .net 为本地应用程序创建插件,因为 .net 制作的东西不是操作系统文件。
【解决方案3】:

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

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

C 和 C++ 程序是原生的。

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

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

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

【讨论】:

  • 我只是想指出,解释型语言(如 Ruby、Python、Lisp 等)与使用 JIT 编译的托管 VM 语言(如 Java)的概念是有区别的和 C#。后者通常不需要使用解释器并最终编译为本机代码。更多信息:en.wikipedia.org/wiki/Interpreted_language
  • @dodgy_coder,你确定 Java 可以编译为本机代码吗?不,它会编译成非本机机器码的字节码。 C# 等 CLR 语言也是如此。
  • Java 和 C# 都包含一个运行时组件,JIT 将字节码编译为本机代码。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2011-03-26
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多