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

时间:2016-06-08 07:49:14

标签: c# clr managed

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

即。它会在CLR下运行吗?

2 个答案:

答案 0 :(得分:5)

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

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

unsafe代码的具体内容是它不是可验证的。它使用即时编译器无法检查的MSIL指令,以确保它不会破坏内存。指针是最明显的情况,抖动无法知道指针取消引用是否安全,它还不知道指针值。

无法验证的代码的结果是有人可以在沙箱中加载程序集并坚持所有代码都必须是可验证的。它不会起作用。当然,最终的结果是,你摸索了代码并写入内存中的任意地址,从而产生非常难以诊断的错误。失去了一周的生命,发现了这个错误。

答案 1 :(得分:3)

托管代码(来自MSDN):

  

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

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

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

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