C#中不安全代码和非托管代码有什么区别?

17

不安全代码和非托管代码在C#中有什么区别?

5个回答

19

托管代码在CLR(公共语言运行时)的监管下运行。CLR负责诸如内存管理和垃圾回收之类的工作。

因此,非托管代码仅在CLR的上下文之外运行。而unsafe则类似于托管代码和非托管代码之间的一种“中间状态”。unsafe仍然在CLR下运行,但它允许您通过指针直接访问内存。


“Context”指的是什么?使用C++/CLI,您可以在一个程序集和一个进程中混合使用托管代码和非托管(本机)代码。 - Niki
1
使用/clr:safe选项(安全模式)编译的C++/CLI程序集保证生成的IL代码是可验证和类型安全的。基本上,安全程序集不能包含任何属于C#不安全块的功能,比如指针算术。要使用这样的功能,必须以/clr:pure(纯模式程序集完全是IL,但可以链接到本机dll;在纯模式下静态链接到本机DLL是不可能的?)或混合模式/clr(它不仅可以链接到本机代码,还可以将其合并到生成的程序集中)编译。 - Protongun

4

C#中的不安全代码允许使用指针。在CLR的上下文中,C#中没有非托管代码。


我一直理解“非托管”代码是指不在CLR上下文中执行的代码...基本上就像调用C/C++ DLL等。 - J J
我完全同意。不过你只能调用 C/C++ 的 DLL,而不能调用 C# 的 DLL,就像你之前提到的那样。 - user203570

2

不安全的代码运行在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");
    }
}

问题并不在于非托管代码本身,而是在于调用它。


0

是的,但您也可以使用DLLImport属性定义外部函数,以引入和连接到本机DLL;一类外部函数句柄可以用作托管代码对本机代码的“包装器”。 - KeithS

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接