本机和托管代码之间的区别?

Joe*_*oel 53 native managed

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

"GlowCode 6.2和x64配置文件本机,托管和混合C++,C#,.NET代码"

他们的意思是什么?

Anz*_*rio 77

本机代码是其内存不是"托管"的代码,因为内存不会为您释放(例如,C++'删除和C是免费的),没有引用计数,没有垃圾回收.您猜对了,托管代码是代码,其内存是免费的,并为您分配,垃圾回收和其他好东西.

混合代码是指具有调用非托管图层的托管代码.通常,当你有一个纯粹的非托管C++ DLL并且你使用P/invoke从.NET调用它.

  • C++/CLI编译器允许托管代码(使用`/ clr`编译并输出为MSIL)在本机堆上分配本机对象(无垃圾回收).此外,(桌面).NET垃圾收集器不使用引用计数(具有循环问题). (3认同)
  • Native*并不意味着内存管理.Native表示它是Windows应用程序或DLL..Net也没有创建.它使用与本机应用程序相同的文件扩展名,但这些exe和dll的内容不是windows exe和dll.这就是为什么你不能使用.net"dll"与本机Windows应用程序,因为它不是一个Windows DLL. (3认同)
  • 自动内存管理只是管理语言的一小部分。最重要的区别是本机代码将编译为二进制可执行文件,而托管代码将编译为字节码,字节码必须在运行时由即时编译器解释。https://docs.microsoft.com/en-us/dotnet/standard/managed-execution-process (2认同)

Way*_*man 46

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

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

  • @pacerier我今天对你问题的回答与我六年前提出的回答有所不同.例如,六年前.NET不是开源的.但最近公布的这一消息有点改变了这方面的一切,不是吗?:) (5认同)

one*_*els 30

本机代码以其运行的计算机的"本机"机器语言编写,并由处理器直接执行.

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

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

管理Java和C#(以及所有.NET语言).

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

混合程序是一个使用本机和托管代码的程序.

  • 我只是想指出,解释语言的概念(如Ruby,Python,Lisp等)与使用JIT编译的托管VM语言(如Java和C#)之间存在差异.后者通常不需要使用解释器,最后编译为本机机器代码.更多信息:http://en.wikipedia.org/wiki/Interpreted_language (3认同)

小智 6

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