繁体   English   中英

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

[英]What is managed or unmanaged code in programming?

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

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

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

总结一下,

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

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

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

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

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

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

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

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

  • 由CLR执行的代码。
  • 针对公共语言运行库(.NET Framework的基础)的代码称为托管代码。
  • 托管代码提供CLR所需的元数据,以提供诸如内存管理,跨语言集成,代码访问安全性和对象的自动生命周期控制等服务。 基于IL的所有代码都作为托管代码执行。
  • 在CLI执行环境下执行的代码。

对于你的问题:

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

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

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

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

用尽可能少的词语:

  • 托管代码= .NET程序
  • 非托管代码=“正常”程序

托管代码:
在与公共语言运行时的“合作合同”下运行的代码。 托管代码必须提供运行时所需的元数据,以提供诸如内存管理,跨语言集成,代码访问安全性和对象的自动生命周期控制等服务。 所有基于Microsoft中间语言(MSIL)的代码都作为托管代码执行。

未管理的代码:
创建的代码不考虑公共语言运行库的约定和要求。 非托管代码在公共语言运行时环境中以最少的服务执行(例如,没有垃圾收集,有限的调试等)。

参考: http//www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

基本上非托管代码是不在.NET CLR下运行的代码(又名不是VB.NET,C#等)。 我的猜测是NUnit有一个不是.NET代码(又名C ++)的运行器/包装器。

NUnit在单独的AppDomain中加载单元测试,我假设没有调用入口点(可能不需要),因此入口程序集为null。

托管代码在CLR环境中运行,即.NET运行时。简而言之,所有IL都是托管代码。但是如果使用某些第三方软件示例VB6或VC ++组件,则它们是非托管代码,因为.NET运行时(CLR)无法控制在源代码执行语言。

托管代码是C#.Net,VB.Net,F#.Net等编译器创建的代码。 它运行在CLR上,其中包括垃圾收集和引用检查等服务。 所以把它想象成,我的代码由CLR管理。

另一方面, 非托管代码直接编译为机器代码。 它不由CLR管理。

托管代码: - 在语言编译器编译之后开发的MSIL(中间语言)表单的代码,由CLR直接执行,称为托管代码。 例如: - .net框架支持的所有61种语言代码

非托管代码: - 在.net之前开发的代码,其MSIL表单不可用,它由CLR直接执行,而CLR将重定向到操作系统,这称为非托管代码。

例如:-COM,Win32 API

  • 托管代码:用.NET语言编写的代码,如C#,VB.NET。
  • UnManaged Code:代码不是用.NET语言编写的,MSIL不理解它是什么,不能在CLR下运行; 就像我们在.NET应用程序中使用的第三方控件一样,它不是用.NET语言创建的。

首先要了解这一点,在.NET framework之前, Microsoft提供了独立的产品,如MFC (Visual C++), VB, FoxPro等。

2002年,微软将其产品结合起来并制作了.NET框架。 现在,在.NET框架中如何执行代码以及如何管理和执行代码之间存在差异。 Microsoft引入了带有.NET框架的CLR概念,它编译来自任何受支持的.NET框架的代码,并提供其他功能,如memory mangement, garbage collection等。但是,此类CLR功能以前无法直接使用。

因此,如果您在.NET框架中创建库/代码(使用CLR编译),则称为Managed code 您可以在其他.NET应用程序/项目中进一步使用此库,CLR也会理解它之前是如何编译的,这就是它仍然是您的管理代码的原因。

OTOH如果你想使用在.NET框架之前编写的库然后你可以做某些限制,但请记住,因为当时CLR不存在,所以现在,CLR将无法理解并再次编译此代码。 这将被称为unmanaged code 请注意,如果不是CLR兼容,由某些第三方创建的用于提供某些功能/工具的库/组件也可以被视为非管理代码。

在外行人看来, 管理代码是您的CLR理解的东西,可以自己编译以便进一步执行。 在.NET框架中,(来自任何使用.NET框架的语言)当代码转到CLR时,代码会提供一些元数据信息,以便CLR可以为您提供此处指定的功能。 其中很少是Garbage collection, Performance improvements, cross-language integration, memory management等。

OTOH, 无人值守代码是机器专用的东西,随时可以使用,无需进一步处理。

从Pro C#5和.NET 4.5 Framework:

托管代码与非托管代码:理解C#语言最重要的一点是,它可以生成只能在.NET运行时内执行的代码(您永远不能使用C#来构建本机COM服务器或非托管C / C ++应用)。 从官方上讲,用于描述面向.NET运行时的代码的术语是托管代码。 包含托管代码的二进制单元称为程序集(有关程序集的更多详细信息)。 相反,.NET运行时无法直接托管的代码称为非托管代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM