C 程式實現動態呼叫非託管的DLL檔案

2022-02-14 12:23:54 字數 2526 閱讀 9111

最近的乙個專案需要用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...