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

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

有帮助吗?

解决方案

这是来自 MSDN 的一些文字 非托管代码.

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

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

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

对于你的问题:

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

其他提示

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

总而言之,

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

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

  1. 非托管代码 被编译为机器代码,因此由操作系统直接执行。因此,它有能力做托管代码所不具备的破坏性/强大的事情。这就是过去一切的工作方式,因此通常它与 .dll 等旧内容相关。

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

  1. 本国的 代码通常与非托管同义,但并不完全相同。

当你想的非托管下,认为机器专用,机器级的代码。就像x86汇编语言。非托管(本机)代码被编译并直接链接它是专为在处理器上运行,排除了所有的OS东西的时刻。这是不可移植的,但它是快。很简单,剥离下来的代码。

管理代码是在.NET运行一切从Java到老解说BASIC,或任何东西。托管代码典型地被编译成中间电平P代码或字节代码指令集。这些都不是具体的机器指令,尽管它们看起来类似于汇编语言。托管代码运行它的计算机隔离程序,并创建所有内存间接分配的安全边界,通常来说,你不必机资源,如端口,内存地址空间,堆栈等直接访问。我们的想法是在一个更安全的环境中运行。

要从一个管理变量转换,也就是说,非托管一个,你必须得到实际的对象本身。它可能包裹或在一些额外的包装盒装。非托管变量(如一个“INT”,说) - 一个32位机器上 - 正好需要4个字节。没有任何开销或额外的包装。然后再返回 - - 从托管到非托管代码去的过程被称为“编组”。它可以让你的程序才可过关。

尽可能简短地说:

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

基本上非托管代码是不所述.NET CLR(又名不VB.NET,C#等)下运行的代码。我的猜测是NUnit的具有浇道/包装这是不.NET代码(又名C ++)。

  

托管代码:结果   这下,以“合作合同”上运行的代码   公共语言运行库。托管代码必须提供元数据   必要的运行时,提供的服务,如内存   管理,跨语言集成,代码访问安全性,并   对象的自动寿命控制。基于微软的所有代码   中间语言(MSIL)执行托管代码。

     

取消托管代码:结果   即不为考虑创建的代码   公约和公共语言运行库的要求。非托管   代码执行公共语言运行时环境以最小   服务(例如,没有垃圾回收,有限的调试和   等等)。

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

NUnit的加载在一个单独的应用程序域的单元测试,我假定入口点没有被调用(可能不是需要的话),因此条目组件为空。

<强>托管代码是什么#.NET,VB.Net,F#.NET等编译器创建。它运行在CLR,其中除其他外提供像垃圾回收和引用检查,以及更多的服务。 所以认为它是,我的代码是由CLR管理。

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

托管代码CLR即.NET runtime.In短所有IL的环境中运行的管理 code.But如果您使用的是一些第三方软件例如VB6或VC ++组件它们是 非托管代码作为.NET运行时(CLR)不具有在源代码的执行控制 的语言。

托管代码: - 其中MSIL(中间语言)形式是语言编译器编译之后开发并由CLR称为托管代码直接执行的代码。 例如: - 由.NET框架支持的所有61语言代码

非托管代码: - 该.net之前开发的代码为哪些MSIL的形式是不可用,它是由CLR直接执行而CLR将重定向到操作系统这被称为非托管代码

例如:-COM,Win32 API的

  • 管理 代码:用 .NET 语言(如 C#、VB.NET)编写的代码。
  • 非托管 代码:代码未用.NET语言编写,MSIL不了解它是什么,也无法在CLR下运行;就像我们在 .NET 应用程序中使用的第三方控件一样,这些控件不是用 .NET 语言创建的。

首先要明白这一点,之前 .NET framework, Microsoft 我们提供独立的产品,例如 MFC (Visual C++), VB, FoxPro ETC。

2002年,微软结合其产品,制作了.NET框架。现在,以前的代码执行方式与 .NET 框架中的代码管理和执行方式有所不同。微软推出的概念 CLR 使用 .NET 框架编译来自任何受支持的 .NET 框架语言的代码并提供附加功能,例如 memory mangement, garbage collection ETC。但是,此类 CLR 功能以前无法直接使用。

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

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

用外行的话来说, 管理代码 是 CLR 可以理解的东西,并且可以自行编译以供进一步执行。在 .NET 框架中,(来自在 .NET 框架上工作的任何语言)当代码进入 CLR 时,代码会提供一些元数据信息,以便 CLR 可以为您提供指定的功能 这里. 。他们中很少有人是 Garbage collection, Performance improvements, cross-language integration, memory management ETC。

奥托, 非托管代码 是特定于机器并且可以使用的东西,无需进一步处理。

从临C#5和.NET 4.5框架:

  

<强>托管与非托管代码:   也许是为了了解关于C#语言中最重要的一点是,它可以产生代码   只能在.NET运行时执行(你永远无法使用C#,来构建本地COM服务器或   非托管C / C ++应用程序)。官方说,该术语用来描述代码瞄准   .NET运行时托管代码。包含托管代码二进制单元被称为一个组件   (上组件的详细信息,在短短位)。相反,代码不能直接由.NET托管   运行时被称为非托管代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top