C#中的托pipe/非托pipe代码是什么?

我在我的C#代码中使用Assembly.GetEntryAssembly() …来获取应用程序的版本。 它运行良好,但是当我在NUnit中尝试它时,它返回NULL 。 在MSDN中,它声明从非托pipe代码调用时可以返回NULL

什么是托pipe或非托pipe代码? 我不明白。

以下是MSDN关于非托pipe代码的一些文本。

某些库代码需要调用非托pipe代码(例如,本机代码API,如Win32)。 因为这意味着要超出托pipe代码的安全范围,因此需要小心。

这里有一些关于托pipe代码的补充说明:

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

对于你的问题:

我想这是因为NUnit为UnitTesting执行你的代码,并可能有一部分是非托pipe的。 但是我不确定,所以不要拿这个黄金。 我相信有人能够给你更多的信息。 希望它有帮助!

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

床单:

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

非托pipe代码被编译为机器代码,因此直接由操作系统执行。 因此,它有能力做破坏/强大的事情托pipe代码不。 这就是所有的工作,所以通常它与旧的东西,如.dll

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

当你想到非托pipe的时候 ,考虑机器特定的机器级代码。 像x86汇编语言一样。 非托pipe(本地)代码被编译和链接,直接运行在专门devise的处理器上,目前不包括所有的操作系​​统。 这不是便携式,但速度很快。 很简单,剥离代码。

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

要从一个托pipevariables转换到非托pipevariables,你必须到达实际的对象本身。 它可能包装或包装在一些额外的包装。 非托pipevariables(比如“int”,比如说)在一个32位的机器上 – 只需要4个字节。 没有额外的包装。 从托pipe代码到非托pipe代码的过程被称为“ 编组 ”( marshaling )。 它允许你的程序跨越边界。

用尽可能less的话来说:

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

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

NUnit在单独的AppDomain中加载unit testing,并且我假定入口点没有被调用(可能不需要),因此入口程序集为空。

托pipe代码运行在CLR环境中,即.NET运行时。总之,所有的IL都是托pipe代码。但是如果你使用的是第三方软件例如VB6或VC ++组件,它们是非托pipe代码,因为.NET运行时(CLR)没有控制权通过语言的源代码执行。

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

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

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

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

非托pipe代码: – .net之前开发的代码,MSIL表单不可用,它直接由CLR执行,而CLR将redirect到操作系统,这被称为非托pipe代码。

例如:-COM,Win32 API

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

首先明白一点,在.NET framework之前, Microsoft提供了像MFC (Visual C++), VB, FoxPro等独立产品。

2002年,微软联合其产品制造了.NET框架。 现在,代码之前执行的代码和.NET框架中的代码是如何pipe理和执行是有区别的。 Microsoft引入了.NET框架的CLR概念,该框架编译来自.NET框架的任何支持语言的代码,并提供诸如memory mangement, garbage collection等附加function。但是,这样的CLRfunction之前没有提供。

所以,如果你正在.NET框架(用CLR编译)中创build库/代码,那么这就是所谓的Managed code 。 您可以在其他的.NET应用程序/项目中进一步使用这个库,CLR也会理解它之前的编译过程,这就是为什么它仍然是您的pipe理代码。

OTOH如果你想使用.NET框架之前编写的库,那么你可以做一些限制,但要记住,因为CLR当时不在那里,所以现在CLR不会再理解和编译这个代码了。 这将被称为unmanaged code 。 请注意,某些第三方为提供某些function/工具而创build的库/集合,如果不是CLR兼容,也可能被视为非pipe理代码。

在外行方面, pipe理代码是CLR理解的东西,可以自行编译进行进一步的执行。 在.NET框架中,(从任何在.NET框架上工作的语言)当代码进入CLR时,代码会提供一些元数据信息,以便CLR可以为您提供这里指定的function。 很less有Garbage collection, Performance improvements, cross-language integration, memory management等。

OTOH, unmanged代码是特定于机器和准备使用的东西,不需要进一步处理。

从Pro C#5和.NET 4.5 Framework:

托pipe与非托pipe代码:也许了解C#语言最重要的一点是,它可以生成只能在.NET运行时执行的代码(您不能使用C#构build本机COM服务器或非托pipeC / C ++应用)。 正式来说,用于描述以.NET运行时为目标的代码的术语是托pipe代码。 包含托pipe代码的二进制单元被称为程序集(更多关于程序集的细节)。 相反,.NET运行时无法直接托pipe的代码被称为非托pipe代码。