Answers:
这是MSDN上有关非托管代码的一些文字。
一些库代码需要调用非托管代码(例如,本机代码API,例如Win32)。因为这意味着要超出托管代码的安全范围,所以需要格外小心。
这是有关托管代码的其他一些补充说明:
对于您的问题:
我认为这是因为NUnit为UnitTesting执行您的代码,并且其中的某些部分可能不受管理。但是我不确定,所以不要拿它当黄金。我相信有人可以为您提供更多信息。希望能帮助到你!
这是一篇关于该主题的好文章。
总而言之,
在同一计算机上安装的运行时引擎中执行的应用程序。没有它,该应用程序将无法运行。运行时环境提供了程序使用的软件例程的常规库,并且通常执行内存管理。它还可以提供从源代码到可执行代码或从中间语言到可执行代码的即时(JIT)转换。Java,Visual Basic和.NET的公共语言运行时(CLR)是运行时引擎的示例。(阅读更多)
自行运行的可执行程序。从操作系统启动,该程序将调用并使用操作系统中的软件例程,但是不需要使用其他软件系统。对于特定平台,已经被汇编为机器语言的汇编语言程序和被汇编为机器语言的C / C ++程序就是非托管代码的示例。(阅读更多)
当您想到非托管时,请考虑机器特定的机器级代码。类似于x86汇编语言。非托管(本机)代码经过编译和链接,可直接在其设计的处理器上运行,此刻不包括所有操作系统内容。它不是便携式的,但速度很快。非常简单,精简的代码。
托管代码包括从Java到旧的Interpretive BASIC的所有内容,或在.NET下运行的所有内容。通常将托管代码编译为中间级别的P代码或字节代码指令集。尽管它们看起来类似于汇编语言,但它们不是特定于机器的指令。托管代码将程序与运行它的计算机隔离开来,并创建一个安全边界,在该边界中间接分配所有内存,通常来说,您无法直接访问机器资源,例如端口,内存地址空间,堆栈等。这个想法是在更安全的环境中运行。
要从托管变量转换为非托管变量,您必须先到达实际对象本身。它可能被包裹或装在其他包装中。在32位计算机上,非托管变量(例如“ int”之类的变量)恰好占用4个字节。没有开销或其他包装。从托管代码变为非托管代码,然后再返回的过程称为“ 封送处理 ”。它允许您的程序越过边界。
托管代码:
与公共语言运行库在“合作合同”下运行的代码。托管代码必须提供运行时所需的元数据,以提供服务,例如内存管理,跨语言集成,代码访问安全性以及对象的自动生命周期控制。所有基于Microsoft中间语言(MSIL)的代码均作为托管代码执行。非托管代码:
创建的代码不考虑公共语言运行时的约定和要求。非托管代码在公共语言运行时环境中以最少的服务(例如,无垃圾收集,有限的调试等)执行。
参考:http : //www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx
托管代码在CLR(即.NET运行时)环境中运行。简而言之,所有IL都是托管代码。但是,如果您使用的是第三方软件示例VB6或VC ++组件,则它们是非托管代码,因为.NET运行时(CLR)无法控制语言的源代码执行。
首先前理解这一点,.NET framework
,Microsoft
分别提供了独立的产品,如MFC (Visual C++), VB, FoxPro
等。
2002年,Microsoft组合了其产品并制作了.NET框架。现在,之前的代码执行方式与.NET框架中的代码管理和执行方式之间存在差异。微软引入CLR
了.NET框架的概念,该概念可编译来自.NET框架的任何受支持的语言的代码,并提供诸如memory mangement, garbage collection
等的其他功能。但是,此类CLR功能以前无法直接使用。
因此,如果要在.NET框架(使用CLR编译)中创建库/代码,则称为
Managed code
。您可以在其他.NET应用程序/项目中进一步使用此库,CLR也会在那里了解其以前的编译方式,因此它仍然是您的管理代码。
OTOH如果您想使用在.NET Framework之前编写的库,则可以做一些限制,但是请记住,由于当时还没有CLR,所以现在,CLR将不再理解并重新编译此代码。 。这将被称为unmanaged code
。请注意,由第三方创建以提供某些功能/工具的库/组件也可能被视为非管理代码,如果它们不兼容CLR。
用外行术语来说,“ 管理代码”是您的CLR理解的,可以自行编译以进一步执行。在.NET Framework中,(使用.NET Framework上的任何语言)当代码进入CLR时,代码将提供一些元数据信息,以便CLR可以为您提供此处指定的功能。他们很少是Garbage collection, Performance improvements, cross-language integration, memory management
等等。
OTOH,未经处理的代码是计算机专用的,可以立即使用,无需进一步处理。