我有时在谈论.NET时听到/读到它,例如"托管代码"和"非托管代码",但我不知道它们是什么,它们有什么区别.根据定义,它们的区别是什么?使用它们中的任何一个都会产生什么后果?此区别是否仅存在于.NET/Windows中?

推荐答案

托管代码

托管代码就是VisualBasic.NET和C#编译器创建.它在CLR(公共语言运行库)上运行,CLR提供垃圾收集、运行时类型判断和引用判断等服务.所以,可以这样想,"我的代码是CLR的managed."

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

非托管代码

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

没有可用内存管理或CLR提供的任何其他功能.

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

混合两者

由于VisualC++可以被编译为托管代码或非托管代码,所以可以在同一应用程序中混合这两个代码.这模糊了两者之间的界限,并使定义复杂化,但值得一提的是,如果您使用的第三方库包含一些写得不好的非托管代码,您仍然可能存在内存泄漏.

下面是我在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相关问答推荐

使用.NET 8时无法识别运行标识符

为什么脚本不从 _Layout 加载并且必须添加到部分视图中?

无法加载文件或程序集 不支持操作. (来自 HRESULT 的异常:0x80131515)

是否有任何为 C# 编写的模糊搜索或字符串相似函数库?

是否有任何 x 次的 for 循环的更短/更简单的版本?

在目录中创建应用程序快捷方式

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

如何右对齐 DataGridView 列中的文本?

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") 返回上午时间而不是下午时间?

Convert.ToBoolean 和 Boolean.Parse 不接受 0 和 1

如何比较 C# 中的(目录)路径?

C# 测试字符串是否为整数?

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

互锁且易变

为什么发布和调试模式下的代码行为不同?

如何从 .NET 读取 PEM RSA 私钥

无法加载文件或程序集System.ValueTuple

如何比较泛型类型的值?

为什么要使用 C# 类 System.Random 而不是 System.Security.Cryptography.RandomNumberGenerator?

多个列表与 IEnumerable.Intersect() 的交集