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