.net - "managed"和 "unmanaged"之间的区别

标签 .net windows unmanaged managed

我有时在谈论 .NET 时听到/读到它,例如“托管代码”和“非托管代码”,但我不知道它们是什么以及它们有什么区别。根据定义,它们有什么区别?使用其中任何一个的后果是什么?这种区别仅存在于 .NET/Windows 中吗?

最佳答案

托管代码

托管代码是 Visual Basic .NET 和 C# 编译器创建的代码。它在 CLR(公共(public)语言运行时)上运行,除其他外,它提供垃圾收集、运行时类型检查和引用检查等服务。因此,可以将其视为“我的代码由 CLR 管理。”

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

非托管代码

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

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

由于您无法使用 Visual Basic 或 C# 创建非托管代码,因此在 Visual Studio 中,所有非托管代码都是用 C/C++ 编写的。

混合两者

由于 Visual C++ 可以编译为托管或非托管代码,因此可以在同一应用程序中混合使用这两种代码。这模糊了两者之间的界限并使定义复杂化,但值得一提的是,如果您使用的第三方库包含一些编写不当的非托管代码,您仍然会遇到内存泄漏。

这是我通过 googling 找到的一个例子:

#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 - "managed"和 "unmanaged"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3563870/

相关文章:

.net - 将十进制格式转换为正确的区域性信息中的字符串

C# 相当于 javascript 的 toSource()

java - 在 Windows 桌面上创建快捷方式图标

java - 在 Windows 7 中运行 Jar 时为 "Execution Protection Violation"

c# - Blittable 对比IL 中的非 Blittable

c# - 如何通过引用将包含字符串的结构从 C# 发送到非托管 C++ 库

.net - 在Log4net中使用包装器类时如何记录方法名称

c# - 使用 C# 将时间跨度值转换为格式 "hh:mm Am/Pm"

windows - Docker 端口绑定(bind)失败。为什么是 "permission denied"?

c# - 非托管 C++ 代码导致 .Net 应用程序崩溃