我在我的C#代码中使用了一个特定的命令,它运行良好。然而,据说它在“非托管”代码中表现不佳。
什么是托管或非托管代码?
我在我的C#代码中使用了一个特定的命令,它运行良好。然而,据说它在“非托管”代码中表现不佳。
什么是托管或非托管代码?
这篇文章是关于这个主题的好文章。
总结一下:
在安装在同一台计算机上的运行时引擎中执行的应用程序。没有它,应用程序无法运行。运行时环境提供程序使用的通用软件库以及通常执行内存管理。它还可以提供即时(JIT)从源代码到可执行代码或从中间语言到可执行代码的转换。Java、Visual Basic 和 .NET 的公共语言运行时 (CLR) 是运行时引擎的例子。(阅读更多)
一个可以自行运行的可执行程序。从操作系统启动,程序调用并使用操作系统中的软件例程,但不需要使用另一个软件系统。已经汇编成机器语言的汇编语言程序和为特定平台编译成机器语言的C/C++程序是非托管代码的示例。(阅读更多)
这是来自MSDN关于非托管代码的一些文本。
某些库代码需要调用非托管代码(例如,Win32之类的本机代码API)。由于这意味着要超出受托管代码的安全边界,因此需要谨慎对待。
以下是有关托管代码的其他补充说明:
针对你的问题:
我认为这是因为NUnit会执行你的代码进行单元测试,可能其中的某个部分是非托管的。但我不确定,所以不要完全相信这一点。我相信有人能够给你更多的信息。希望能帮到你!
当你想到非托管时,就应该想到与机器特定、机器级别的代码。例如x86汇编语言。非托管(本地)代码被编译和链接以直接在设计它的处理器上运行,暂时排除所有操作系统的东西。它不可移植,但速度非常快。非常简单,剥离了很多代码。
托管代码包括从Java到旧版解释性BASIC或任何在.NET下运行的内容。托管代码通常被编译为中间级P-Code或字节码指令集。这些指令与机器无关,虽然看起来类似于汇编语言。托管代码隔离程序与其运行的机器之间,并创建一个安全边界,在其中所有内存都是间接分配的,一般来说,您不能直接访问机器资源,如端口、内存地址空间、堆栈等。其想法是在更安全的环境下运行。
要将托管变量转换为非托管变量,例如,必须获取实际对象本身。它可能会包装或盒装在其他包装中。在32位机器上,非托管变量(例如'int')需要正好4个字节,没有开销或额外的包装。从托管代码到非托管代码的转换 - 再返回 - 称为"封送"。它允许您的程序跨越边界。
尽可能简短地说:
托管代码是由C#.Net、VB.Net、F#.Net等编译器创建的。它在CLR上运行,CLR提供垃圾回收、引用检查等服务,以及更多功能。因此,可以理解为我的代码由CLR进行管理。
另一方面,非托管代码直接编译成机器码。它不由CLR进行管理。
基本上,非托管代码是指不运行在.NET CLR(即不是VB.NET、C#等)下的代码。我猜测NUnit有一个运行器/包装器,它不是.NET代码(即C++)。
托管代码运行在CLR即.NET运行时环境中。简而言之,所有的IL代码都是托管代码。但如果你使用一些第三方软件,比如VB6或VC++组件,它们就是非托管代码,因为.NET运行时环境(CLR)无法控制语言源代码的执行。