託管DLL和非託管DLL的區別

2021-06-17 16:44:07 字數 1282 閱讀 4259

首先解釋一下,託管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函式。

託管呼叫非託管的DLL

dllimport createnewprocess.dll charset charset.unicode public static extern bool createprocess marshalas unmanagedtype.lpwstr string fullpath 以上是定義入口,...

C 呼叫託管DLL與非託管DLL

dll之前使用過幾次,但是最近使用時,又出各種問題。最後弄到晚上十二點多了,看到網上乙個建立dll的 教程,按上面的講解,成功實現了c 呼叫自己建立的dll。之所以耗了這麼久時間,是因為我本想憑自己記憶實現dll建立呼叫,但是各種問題隨即產生。不說了,割了 今天上午再次整理,覺得有必要記錄。c 呼叫...

託管非託管Dll動態呼叫

最近經常看到有人問託管非託管 dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了 dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath ...