最近的乙個專案需要用c#呼叫c++的dll,由於c++的dll是非託管的,所以呼叫時需要一些技巧。下面分享給新手。
一.dll檔案
動態鏈結庫(也稱為
dll,即為
「dynamic link library」
的縮寫)是
microsoft windows
最重要的組成要素之一,開啟
windows
系統資料夾,你會發現資料夾中有很多
dll檔案,
windows
就是將一些主要的系統功能以
dll模組的形式實現。
動態鏈結庫是不能直接執行的,也不能接收訊息,它只是乙個獨立的檔案,其中包含能被程式或其它
dll呼叫來完成一定操作的函式
(方法。注:
c#中一般稱為「方法
」),但這些函式不是執行程式本身的一部分,而是根據程序的需要按需載入,此時才能發揮作用。
dll只有在應用程式需要時才被系統載入到程序的虛擬空間中,成為呼叫程序的一部分,此時該
dll也只能被該程序的執行緒訪問,它的控制代碼可以被呼叫程序所使用,而呼叫程序的控制代碼也可以被該
dll所使用。在記憶體中,乙個
dll只有乙個例項,且它的編制與具體的程式語言和編譯器都沒有關係,所以可以通過
dll來實現混合語言程式設計。
dll函式中的**所建立的任何物件(包括變數)都歸呼叫它的執行緒或程序所有。
二、dll的呼叫
每種程式語言呼叫
dll的方法都不盡相同,在此只對用
c#呼叫
dll的方法進行介紹。首先
,您需要了解什麼是託管
,什麼是非託管。一般可以認為:非託管**主要是基於
win 32
平台開發的
dll,
activex
的元件,託管**是基於
.net
平台開發的。如果您想深入了解託管與非託管的關係與區別,及它們的執行機制,請您自行查詢資料,本檔案在此不作討論。
(一)呼叫dll中的非託管函式一般方法
首先,應該在
c#語言源程式中宣告外部方法,其基本形式是:
[dllimport(「dll
檔案」)]
修飾符extern
返回變數型別
方法名稱
(引數列表)
其中:
dll檔案:包含定義外部方法的庫檔案。
修飾符:
訪問修飾符,除了
abstract
以外在宣告方法時可以使用的修飾符。
返回變數型別:在
dll檔案中你需呼叫方法的返回變數型別。
方法名稱:在
dll檔案中你需呼叫方法的名稱。
引數列表:在
dll檔案中你需呼叫方法的列表。
注意:需要在程式宣告中使用
system.runtime.interopservices
命名空間。
dllimport
只能放置在方法宣告上。
dll檔案必須位於程式當前目錄或系統定義的查詢路徑中(即:系統環境變數中
path
所設定的路徑)。
返回變數型別、方法名稱、引數列表一定要與
dll檔案中的定義相一致。
若要使用其它函式名,可以使用
entrypoint
屬性設定,如:
[dllimport("user32.dll", entrypoint="messageboxa")]
static extern int msgbox(int hwnd, string msg, string caption, int type);
其它可選的
dllimportattribute
屬性:charset
指示用在入口點中的字符集,如:
charset=charset.ansi
;setlasterror
指示方法是否保留
win32"
上一錯誤
",如:
setlasterror=true
;exactspelling
指示entrypoint
是否必須與指示的入口點的拼寫完全匹配,如:
exactspelling=false
;preservesig
指示方法的簽名應當被保留還是被轉換,
如:preservesig=true
;callingconvention
指示入口點的呼叫約定,
如:callingconvention=callingconvention.winapi
;基本的方法就是這樣,大家可以嘗試一下。
c 託管非託管Dll動態呼叫
最近經常看到有人問託管非託管dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath 這裡...
託管非託管Dll動態呼叫
最近經常看到有人問託管非託管 dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了 dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath ...
C 呼叫C C 建立的非託管動態庫
c 可以呼叫由c c 語言建立的非託管動態鏈結庫,這需要用到 dllimport dll 根據msdn上的解釋,dllimport註解 attribute 用於指定乙個非託管的動態鏈結庫的匯出函式為靜態入口點。下面引用乙個官方的例子來說明該註解的用法 using system using syste...