我在我的C#代码中使用了一个特定的命令,效果很好。但是,据说它在“非托管”代码中行为不端。
什么是托管代码或非托管代码?
答案 0 :(得分:183)
This是一篇关于这个主题的好文章。
总结一下,
在运行时引擎中执行的应用程序 安装在同一台机器上。没有它,应用程序无法运行。 运行时环境提供通用软件库 程序使用的例程,通常执行内存 管理。它还可以提供即时(JIT)转换 源代码到可执行代码或从中间语言到 可执行代码。 Java,Visual Basic和.NET的公共语言运行时 (CLR)是运行时引擎的示例。 (Read more)
自行运行的可执行程序。从经营中推出 系统,程序调用并使用中的软件例程 操作系统,但不需要其他软件系统 用过的。已组装成机器的汇编语言程序 语言和C / C ++程序编译成机器语言 特定平台是非托管代码的示例。(Read more)
答案 1 :(得分:70)
以下是MSDN中有关unmanaged code的一些文字。
某些库代码需要调用非托管代码(例如,本机代码API,如Win32)。因为这意味着要超出托管代码的安全范围,所以需要谨慎。
以下是关于托管代码的其他一些补充说明:
对于你的问题:
我认为这是因为NUnit执行了UnitTesting的代码,并且可能有部分内容是非托管的。但我不确定,所以不要把它当作黄金。我相信有人能够为您提供更多相关信息。希望它有所帮助!
答案 2 :(得分:64)
当您想到非托管时,请考虑特定于机器的机器级代码。像x86汇编语言一样。非托管(本机)代码经过编译和链接,可直接在其设计的处理器上运行,目前不包括所有操作系统内容。它不便携,但速度很快。非常简单,剥离代码。
托管代码是从Java到旧的Interpretive BASIC,或在.NET下运行的任何代码。托管代码通常被编译为中间级别的P-Code或字节代码指令集。这些不是特定于机器的指令,尽管它们看起来类似于汇编语言。托管代码使程序与其运行的机器隔离,并创建一个安全边界,其中所有内存都是间接分配的,一般来说,您无法直接访问机器资源,如端口,内存地址空间,堆栈等这个想法是在更安全的环境中运行。
要从托管变量转换为非托管变量,您必须转到实际对象本身。它可能包装或装在一些额外的包装中。在32位机器上的非托管变量(比如说'int') - 只需要4个字节。没有开销或额外的包装。从托管代码转到非托管代码的过程 - 又回来 - 被称为“封送”。它允许您的程序跨越边界。
答案 3 :(得分:21)
用尽可能少的词语:
答案 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)
答案 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,无人值守代码是特定于机器并且可以使用的东西,无需进一步处理。