1. 程式人生 > 程式設計 >C#中託管DLL和非託管DLL的區別詳解

C#中託管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函式)。“平臺呼叫”依賴於元資料在執行時查詢匯出函式並封裝其引數。

在託管程式碼中使用“平臺呼叫”服務呼叫非託管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下使用了。

到此這篇關於C#中託管DLL和非託管DLL的區別詳解的文章就介紹到這了,更多相關C# 託管DLL和非託管DLL內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!