“pipe理”和“非pipe理”之间的区别

有时我在讨论.NET时会听到/读到它,例如“托pipe代码”和“非托pipe代码”,但我不知道它们是什么,它们有什么不同。 根据定义,它们有什么不同? 使用其中之一会有什么后果? .NET / Windows中是否存在这种区别?

托pipe代码

托pipe代码是Visual Basic .NET和C#编译器创build的。 它运行在CLR(通用语言运行时)上,除此之外,它还提供垃圾收集,运行时types检查和引用检查等服务。 所以,把它想成“我的代码由CLR pipe理 ”。

Visual Basic和C# 只能生成托pipe代码,因此,如果您正在使用其中一种语言编写应用程序,那么您正在编写由CLRpipe理的应用程序。 如果您正在Visual C ++ .NET中编写应用程序,则可以根据需要生成托pipe代码,但这是可选的。

非托pipe代码

非托pipe代码直接编译为机器代码。 因此,通过这个定义,所有由传统的C / C ++编译器编译的代码都是“非托pipe代码”。 另外,由于它编译为机器码而不是中间语言,因此它是不可移植的。

没有空闲的内存pipe理或CLR提供的任何其他内容。

由于无法使用Visual Basic或C#创build非托pipe代码,所以在Visual Studio中,所有非托pipe代码都是用C / C ++编写的。

混合两个

由于Visual C ++可以编译为托pipe代码或非托pipe代码,因此可以在同一个应用程序中混合使用这两种代码。 这模糊了两者之间的界限,并使定义复杂化,但值得一提的是,如果您正在使用带有一些写入非托pipe代码的第三方库,则仍然可能发生内存泄漏。

以下是我通过Googlesearchfind的一个示例:

#using <mscorlib.dll> using namespace System; #include "stdio.h" void ManagedFunction() { printf("Hello, I'm managed in this section\n"); } #pragma unmanaged UnmanagedFunction() { printf("Hello, I am unmanaged through the wonder of IJW!\n"); ManagedFunction(); } #pragma managed int main() { UnmanagedFunction(); return 0; } 

这比.NET和Windows更普遍。 托pipe是一个环境,你有自动内存pipe理,垃圾收集,types安全,…非托pipe的一切。 因此,例如,.NET是一个托pipe环境,C / C ++是非托pipe的。

托pipe代码是由Microsoft创build的一个区分,用于识别需要并将仅在公共语言运行时虚拟机的“pipe理”(导致字节码)下执行的计算机程序代码。

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm

托pipe代码是编写用于定位受pipe运行时执行环境的服务的代码,例如.Net技术中的Common Language Runtime。

在公共语言运行环境下运行的托pipe代码不能在运行时环境之外访问,也不能在运行时环境之外直接调用。 它是指本地执行代码和运行时间之间的合作合同。 它提供垃圾收集,运行时types检查,参考检查等服务。通过使用托pipe代码,您可以避免导致安全漏洞和不稳定应用程序的许多典型编程错误,同时还会自动处理许多非生产性编程任务如types安全检查,内存pipe理,未使用对象的销毁等

什么是非托pipe代码?

非托pipe代码直接编译为机器代码,并直接由操作系统执行。 生成的代码在主机处理器上本地运行,处理器直接执行编译器生成的代码。 它总是编译为特定的架构,只能运行在预期的平台上。 所以,如果你想在不同的体系结构上运行相同的代码,那么你将不得不使用特定的体系结构重新编译代码。

非托pipe的可执行文件基本上是一个二进制映像,x86代码,直接加载到内存中。 这种方法通常会导致代码执行速度最快,但是在大多数情况下,诊断和从错误中恢复可能会很困难且耗时。 内存分配,types安全性,安全性等需要由程序员来处理,这将导致非托pipe代码容易出现内存泄漏,如缓冲区溢出,指针覆盖等。

所有由传统的C / C ++编译器编译的代码都是非托pipe代码。 COM组件,ActiveX接口和Win32 API函数是非托pipe代码的示例。 托pipe代码是用许多高级编程语言编写的代码,可用于Microsoft .NET Framework,包括VB.NET,C#,J#,JScript.NET等。由于Visual C ++可以编译为托pipe代码或非托pipe代码有可能在同一个应用程序中混合使用两者。