当前位置:  开发笔记 > 编程语言 > 正文

编程中的托管代码或非托管代码是什么?

如何解决《编程中的托管代码或非托管代码是什么?》经验,为你挑选了4个好方法。

我在我的C#代码中使用了一个特定的命令,该代码运行良好.但是,据说在"非托管"代码中行为不端.

什么是托管代码或非托管代码?



1> annakata..:

这是一篇关于这个主题的好文章.

婴儿床单:

托管代码不是编译为机器代码,而是编译为中间语言,由机器上的某些服务解释和执行,因此在一个(希望是!)安全框架内运行,该框架为您处理内存和线程等危险事物.在现代用法中,这通常意味着.NET,但并非如此.

在安装在同一台机器中的运行时引擎中执行的应用程序.没有它,应用程序无法运行.运行时环境提供程序使用的通用软件程序库,通常执行内存管理.它还可以提供从源代码到可执行代码或从中间语言到可执行代码的即时(JIT)转换.Java,Visual Basic和.NET的公共语言运行时(CLR)是运行时引擎的示例.(了解更多)

非托管代码被编译为机器代码,因此直接由OS执行.因此,它有能力做破坏/强大的事情托管代码没有.这就是所有东西用来工作的方式,所以通常它与像.dll这样的旧东西相关联.

一个可执行的程序,它自己运行.程序从操作系统启动,调用并使用操作系统中的软件例程,但不需要使用其他软件系统.已组装成机器语言的汇编语言程序和编译为特定平台的机器语言的C/C++程序是非托管代码的示例.(读取模式)

本机代码通常与Unmanaged同义,但不完全相同.


我曾经被面试官问到,我们可以在C#中运行/编写非托管代码吗?任何人都可以帮忙吗?
@RSB:您无法在C#中编写非托管代码(但是,您可以直接从C#调用非托管代码).从理论上讲,使用正确的编译器和框架,我猜你可以做到.实际上,这意味着您需要一个可以直接将C#编译为机器代码的编译器.不确定这是怎么回事.
@H_wardak你定义为'黑客'是什么?这是一个非常通用的术语,就像是说攻击NORAD和黑客攻击一些寄存器是一样的.

2> Patrick Desj..:

以下是MSDN中有关非托管代码的一些文本.

某些库代码需要调用非托管代码(例如,本机代码API,如Win32).因为这意味着要超出托管代码的安全范围,所以需要谨慎.

以下是关于托管代码的其他一些免费解释:

由CLR执行的代码.

针对公共语言运行库(.NET Framework的基础)的代码称为托管代码.

托管代码提供CLR所需的元数据,以提供诸如内存管理,跨语言集成,代码访问安全性和对象的自动生命周期控制等服务.基于IL的所有代码都作为托管代码执行.

在CLI执行环境下执行的代码.

对于你的问题:

我认为这是因为NUnit执行UnitTesting的代码,并且可能有一部分是非托管的.但我不确定,所以不要把它当作黄金.我相信有人能够为您提供更多相关信息.希望能帮助到你!


我很感激您的回答.但是那些不知道"托管代码是什么"的人会对你在答案中的意思感到困惑:他们不会知道:"库代码","非托管代码","本机代码API",CLR, .net框架,IL,CLI执行环境等的基础

3> 小智..:

当您想到非托管时,请考虑特定于机器的机器级代码.像x86汇编语言一样.非托管(本机)代码经过编译和链接,可直接在其设计的处理器上运行,目前不包括所有操作系统内容.它不便携,但速度很快.非常简单,精简代码.

托管代码是从Java到旧的Interpretive BASIC,或者在.NET下运行的任何东西.托管代码通常被编译为中间级别的P-Code或字节代码指令集.这些不是特定于机器的指令,尽管它们看起来类似于汇编语言.托管代码使程序与其运行的机器隔离,并创建一个安全边界,其中所有内存都是间接分配的,一般来说,您无法直接访问机器资源,如端口,内存地址空间,堆栈等这个想法是在更安全的环境中运行.

要从托管变量转换为非托管变量,您必须转到实际对象本身.它可能包装或包装在一些额外的包装中.在32位机器上的非托管变量(比如说'int') - 只需要4个字节.没有开销或额外的包装.从托管代码转到非托管代码的过程 - 再回来 - 称为" 编组 ".它允许您的程序跨越边界.



4> Vilx-..:

用尽可能少的词语:

托管代码= .NET程序

非托管代码="正常"程序


.NET程序不是"正常"吗?
推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有