是否管理C#不安全代码?

是否管理C#不安全代码?,c#,clr,managed,C#,Clr,Managed,如果您编写了一个C#程序,并且部分代码是使用unsafe关键字编写的,那么该代码是否仍被视为“托管”代码 即,它是否在CLR下运行?托管代码(来自MSDN): 托管代码是用二十多种高级语言中的一种编写的代码 可用于Microsoft的编程语言 .NET框架,包括C#、J#、Microsoft Visual Basic.NET、, 微软JScript .NET和C++。所有这些语言都有一个共同点 一组统一的类库,可以编码到中间 语言(IL)。运行时感知编译器将IL编译为本机 托管执行环境中的可执行

如果您编写了一个C#程序,并且部分代码是使用
unsafe
关键字编写的,那么该代码是否仍被视为“托管”代码


即,它是否在CLR下运行?

托管代码(来自MSDN):

托管代码是用二十多种高级语言中的一种编写的代码 可用于Microsoft的编程语言 .NET框架,包括C#、J#、Microsoft Visual Basic.NET、, 微软JScript .NET和C++。所有这些语言都有一个共同点 一组统一的类库,可以编码到中间 语言(IL)。运行时感知编译器将IL编译为本机 托管执行环境中的可执行代码,确保 类型安全、数组绑定和索引检查、异常处理和 垃圾收集。 通过使用托管代码并在此托管执行环境中编译, 您可以避免许多导致安全漏洞的典型编程错误 和不稳定的应用程序。 此外,许多非生产性编程任务会自动处理, 例如类型安全检查、内存管理和销毁不需要的对象

托管代码在CLR的监督下运行,CLR负责内存管理和垃圾收集

否则,非托管代码将在CLR上下文之外运行

不安全代码仍在CLR下运行,并被转换为IL,但它将允许您直接通过指针访问内存。

托管代码”无法帮助您正确思考
不安全关键字。托管代码最基本的方面是它与垃圾收集器兼容。它必须能够找到该代码使用的对象引用,以便能够正确确定该对象是否正在使用。这需要一个非常具体的细节,在运行时GC必须能够找到一个描述对象引用存储位置的表。局部变量和方法参数是棘手的问题。该表由即时编译器或提前编译器(如Ngen.exe或.NET Native)生成

C#总是生成托管代码,没有选项生成GC无法探测的方法。在.NET程序集中生成非托管代码是可能的,C++/CLI编译器可以做到这一点。这意味着C代码总是需要CLR,没有它就没有GC

不安全
代码的高度特定性在于它是不可验证的。它使用即时编译器无法检查的MSIL指令来确保不会损坏内存。指针是最明显的情况,抖动无法知道指针解引用是否安全,它还不知道指针值


不可验证代码的结果是,有人可以在沙箱中加载程序集,并坚持所有代码都必须是可验证的。这行不通。当然,最终的结果是,你摸索着编写代码并写入内存中的任意地址,产生了一个很难诊断的bug。在你的生命中损失一周的时间来发现这个bug是意料之中的。

是的,它将在CLR下运行。看到这个答案了吗?它没有完全管理。它介于托管和非托管之间。