2010-09-22 22 views

回答

15

託管代碼在CLR(公共語言運行時)的監督下運行。這對內存管理和垃圾收集等事情負責。

因此,非託管簡單地運行在CLR的上下文之外。不安全是一種「中間」管理和非管理。不安全的仍然在CLR下運行,但它可以讓你直接通過指針訪問內存。

+0

@NullUserExceptin:謝謝你,對我真的很有用 – ashish 2010-09-22 16:01:46

+0

你是什麼意思的「背景」?使用C++/CLI,您可以在一個進程中在一個程序集中混合託管和非託管(本地)代碼。 – Niki 2010-09-22 16:49:37

+1

使用/ clr:safe選項(安全模式)編譯的C++/CLI程序集可確保生成的IL代碼可驗證,並且類型安全。實質上,安全程序集不能包含屬於C#不安全塊的任何功能,例如指針算術。要使用這種功能,必須使用/ clr:pure進行純模式編譯(純模式程序集完全是IL,但可能與本機DLL鏈接;在純模式下靜態鏈接本機DLL是不可能的)或混合模式/ clr (它不僅可以鏈接本機代碼,而且可以將它集成到生成的程序集中)。 – Protongun 2014-07-30 15:45:30

3

C#中的不安全代碼允許使用指針。在CLR的上下文中,C#中沒有非託管代碼。

+0

我一直明白「非託管」代碼不會在CLR的上下文中執行代碼...基本上來電來樣C/C++ DLL和等。 – 2010-09-22 15:49:34

+0

我完全同意。你不會P /調用任何C#DLL,只是C/C++的,正如你所提到的。 – 2010-09-22 15:55:50

0

不安全 - 代碼,可以是MSIL

可覈查的子集

非託管之外 - 代碼不被運行時管理,因此是不可見 的GC(例如原生編譯的x86功能將非託管。)

從:http://forums.devx.com/archive/index.php/t-15405.html

+0

您使用類似pinvoke的方式運行.net中的非託管代碼 – Hal 2010-09-22 15:49:47

+0

是的,但您也可以使用DLLImport屬性定義外部函數以引入並掛接到本機DLL;一類extern函數句柄可以用作本地代碼的託管「包裝器」。 – KeithS 2010-09-22 15:57:26

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"); 
    } 
} 

它不一定非託管代碼本身,而是調用它。

相關問題