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

时间:2008-12-02 15:31:37

标签: c# .net unmanaged definition managed

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

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

12 个答案:

答案 0 :(得分:183)

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

总结一下,

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

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

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

      自行运行的可执行程序。从经营中推出   系统,程序调用并使用中的软件例程   操作系统,但不需要其他软件系统   用过的。已组装成机器的汇编语言程序   语言和C / C ++程序编译成机器语言   特定平台是非托管代码的示例。(Read more

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

答案 1 :(得分:70)

以下是MSDN中有关unmanaged code的一些文字。

  

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

以下是关于托管代码的其他一些补充说明:

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

对于你的问题:

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

答案 2 :(得分:64)

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

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

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

答案 3 :(得分:21)

用尽可能少的词语:

  • 托管代码= .NET程序
  • unmanaged code =“normal”program

答案 4 :(得分:5)

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

答案 5 :(得分:4)

  

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

     

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

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

答案 6 :(得分:3)

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

答案 7 :(得分:3)

托管代码是C#.Net,VB.Net,F#.Net等编译器创建的。它运行在CLR上,除其他功能外,CLR还提供垃圾收集,引用检查等服务。 因此,我的代码由CLR管理。

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

答案 8 :(得分:2)

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

答案 9 :(得分:1)

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

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

例如:-COM,Win32 API

答案 10 :(得分:1)

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

答案 11 :(得分:0)

首先要了解这一点,在.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可以为您提供指定的here功能。其中很少是Garbage collection, Performance improvements, cross-language integration, memory management等。

OTOH,无人值守代码是特定于机器并且可以使用的东西,无需进一步处理。