gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:52:36 27 4
gpt4 key购买 nike

我有时在谈论 .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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com