托管DLL和非托管DLL的區別


首先解釋一下,托管DLL和非托管DLL的區別。狹義解釋講,托管DLL就在Dotnet環境生成的DLL文件。非托管DLL不是在Dotnet環
境生成的DLL文件。

托管DLL文件,可以在Dotnet環境通過 “添加引用” 的方式,直接把托管DLL文件添加到項目中。然后通過 Using DLL命
名空間,來調用相應的DLL對象 。

非托管DLL文件,在Dotnet環境應用時,通過 DllImport 調用。

C# 調用非托管DLL文件。DLL文件是用C語言編寫的。


托管DLL就是能夠在公共語言運行庫(Common Language Runtime,簡稱CLR)中能夠直接引用的,並且擴展名為“DLL”的文件。
具體所指就是封裝各種命名空間所在的DLL文件,如System.dll等。非托管DLL就是平常所的動態鏈接庫等,其中就包括了封裝所
有Windows API函數的DLL文件。各種非托管DLL中的函數在公共語言運行庫中不能直接被調用,而需要經過.Net框架提供的“平
台調用”服務后才可以。

  “平台調用”是.Net框架為Visual Basic .Net、Visual C#等.Net開發語言提供的一種服務,用以在托管代碼中引入各種
非托管DLL中封裝的函數(其中包括Windows API函數)。“平台調用”依賴於元數據在運行時查找導出函數並封裝其參數。圖01
公共語言運行庫利用“平台服務”調用非托管DLL中的函數的流程圖:

 

圖01:“平台服務”的調用非托管函數的流程圖

  在托管代碼中使用“平台調用”服務調用非托管DLL中封裝的函數時,“平台服務”將依次執行以下操作:

  1. 查找包含該函數所在的DLL文件。

  2. 如果找到,則將該DLL文件 加載到內存中。

  3. 查找函數在內存中的地址並將其參數推到堆棧上,並封送所需的數據。

  4. 將控制權轉移給非托管函數。 這樣整個函數調用完成。

  在Visual Basic .Net中使用“平台調用”服務,申明Windows API函數主要有二種具體的實現方法:

  1. 使用DllImport特征類來申明Windows API函數。

  2. 使用“Declare”語句來申明Windows API函數。

  這二種方法雖有異曲同工之效,但在繁簡上卻有很大差異,第一種方法申明過程比較復雜,很容易在申明Windows API函數
時出錯,所以並不提倡。而第二種方法相對簡單,並且又保存了以前Visual Basic中的很多語法,所以在平常時大都使用這種方
法來申明Windows API函數。

 

regasm:
regasm注冊的是.net框架下生成的dll(托管與clr)

regsvr32:
regsvr32注冊的是要用C++寫的(非托管)
而C#寫的就必須用Regasm注冊

托管DLL,說白了,就是 完全由.NET托管代碼實現的DLL,完全依賴於 .NET 平台的 CLR 運行。托管DLL,受.NET CLR管控,支
持內存自動回收等的,對於.NET平台是安全DLL

非托管DLL,是指完全或者部分 不是用.NET代碼實現,不依賴於.NET平台即可運行,例如 COM方式 的DLL,不支持自動回收內存
,對於.NET平台而言,也是非安全可控的。

 

其他平台的使用vc++、vb等語言寫成的dll文件,在.net環境下使用的話,可以使用regsvr32注冊后,就可以在.net下使用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM