不安全代码和非托管代码在C#中有什么区别?
托管代码在CLR(公共语言运行时)的监管下运行。CLR负责诸如内存管理和垃圾回收之类的工作。
因此,非托管代码仅在CLR的上下文之外运行。而unsafe则类似于托管代码和非托管代码之间的一种“中间状态”。unsafe仍然在CLR下运行,但它允许您通过指针直接访问内存。
C#中的不安全代码允许使用指针。在CLR的上下文中,C#中没有非托管代码。
不安全的代码运行在CLR内,而非托管代码运行在CLR外。
不安全代码的一个例子是:
unsafe class MyClass
{
private int * intPtr;
}
您可以在此类中的任何地方使用指针。
非托管代码的一个例子是:
class MyClass
{
[DllImport("someUnmanagedDll.dll")]
static extern int UnManagedCodeMethod(string msg, string title);
public static void Main()
{
UnManagedCodeMethod("calling unmanaged code", "hi");
}
}
问题并不在于非托管代码本身,而是在于调用它。
不安全 - 可以在CIL的可验证子集之外的代码
非托管的 - 由运行时管理的代码,因此对GC不可见(例如,本机编译的x86函数将是非托管的)