C#中不安全的代碼和非託管代碼有什麼區別?C#中不安全的代碼和非託管代碼之間有什麼區別?
回答
託管代碼在CLR(公共語言運行時)的監督下運行。這對內存管理和垃圾收集等事情負責。
因此,非託管簡單地運行在CLR的上下文之外。不安全是一種「中間」管理和非管理。不安全的仍然在CLR下運行,但它可以讓你直接通過指針訪問內存。
C#中的不安全代碼允許使用指針。在CLR的上下文中,C#中沒有非託管代碼。
我一直明白「非託管」代碼不會在CLR的上下文中執行代碼...基本上來電來樣C/C++ DLL和等。 – 2010-09-22 15:49:34
我完全同意。你不會P /調用任何C#DLL,只是C/C++的,正如你所提到的。 – 2010-09-22 15:55:50
不安全 - 代碼,可以是MSIL
可覈查的子集非託管之外 - 代碼不被運行時管理,因此是不可見 的GC(例如原生編譯的x86功能將非託管。)
不安全代碼運行的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");
}
}
它不一定非託管代碼本身,而是調用它。
以下是您可以在不安全的環境中執行的操作。
http://msdn.microsoft.com/en-us/library/aa664769%28v=VS.71%29.aspx
- 1. 託管代碼和非託管代碼之間的調用代碼
- 2. 什麼是託管代碼和非託管代碼?
- 3. 託管和非託管DLL之間有什麼區別
- 4. 困惑!代碼第一和代碼之間有什麼區別?
- 5. 非託管代碼之間的快速數據交換和託管代碼
- 6. 託管代碼與非託管代碼
- 7. 託管和非託管代碼之間的轉換
- 8. 在託管代碼和非託管代碼之間共享數據庫事務
- 9. .NET中的託管代碼和非託管代碼
- 10. 流星中部署的代碼和調試代碼之間有什麼區別?
- 11. 在非託管C++代碼
- 12. 什麼是C/C++中的「安全」和「不安全」代碼?
- 13. GC和C#非託管代碼/ C++
- 14. 在此代碼中,Continue和GoTo之間有什麼區別嗎?
- 15. MEF和非託管代碼
- 16. 從非託管流中讀取 - 不安全的代碼,IntPtr的
- 17. C++ cli從非託管代碼調用託管代碼
- 18. 將非託管C++代碼編譯爲託管代碼
- 19. C++/cli將託管代碼傳遞給非託管代碼
- 20. C#中這個非託管代碼有什麼問題?
- 21. 代碼有什麼區別
- 22. 託管C++和C#有什麼區別?
- 23. EXC_BAD_ACCESS中的代碼= 1和代碼= 2有什麼區別?
- 24. 調試託管代碼和非託管代碼
- 25. 釋放C#中的非託管代碼
- 26. 黑/白託管/非託管和本機代碼有什麼不同?
- 27. 這些C++代碼有什麼區別?
- 28. C#非託管代碼不工作
- 29. 自修改代碼和反射之間有什麼區別?
- 30. 更改託管代碼中非託管代碼的內存值
@NullUserExceptin:謝謝你,對我真的很有用 – ashish 2010-09-22 16:01:46
你是什麼意思的「背景」?使用C++/CLI,您可以在一個進程中在一個程序集中混合託管和非託管(本地)代碼。 – Niki 2010-09-22 16:49:37
使用/ clr:safe選項(安全模式)編譯的C++/CLI程序集可確保生成的IL代碼可驗證,並且類型安全。實質上,安全程序集不能包含屬於C#不安全塊的任何功能,例如指針算術。要使用這種功能,必須使用/ clr:pure進行純模式編譯(純模式程序集完全是IL,但可能與本機DLL鏈接;在純模式下靜態鏈接本機DLL是不可能的)或混合模式/ clr (它不僅可以鏈接本機代碼,而且可以將它集成到生成的程序集中)。 – Protongun 2014-07-30 15:45:30