C 呼叫C DLL的方式

2021-06-22 20:41:53 字數 2182 閱讀 5956

動態鏈結庫(dll)是乙個包含可由多個程式同時使用的**和資料的庫,dll不是可執行檔案。可以說在windows作業系統中隨處可見,開啟主分割槽盤下的system32。在一些專案中,如果有大量運算或者涉及大量演算法時通常使用c或c++語言封裝成乙個dll,開放一些介面供其他程式呼叫。

下面是寫的乙個簡單的dll**,主要做示例,功能非常簡單

1、dll提供外部呼叫的方法

extern"c

" _declspec(dllexport) int max(int a,int

b);extern"c

" _declspec(dllexport) int sum(int a,int

b);extern"c

" _declspec(dllexport) int min(int a,int b);

2、方法的實現

int max(int a,int

b)int sum(int a,int

b)int min(int a,int

b)

本文主要是介紹使用c#如何呼叫dll不是重點,只做簡單的介紹

一、c#呼叫dll

在使用c#呼叫c++,需要使用系統kernel32.dll來匯入dill,一般需要如下三個函式

[dllimport("

kernel32

",setlasterror=true

)]

private

static

extern

int getprocaddress(int handle,string

funcname);

[dllimport(

"kernel32

",setlasterror=true

)]

private

static

extern

int loadlibrary(string

dllpath);

[dllimport(

"kernel32

",setlasterror=true

)]

private

static

extern

int freelibrary(int handle);

其中:loadlibrary方法用來匯入dll

freelibrary方法用來釋放dll

getprocadress方法用來獲取dll中的方法訪問的位址。

然後需要在c#中建立乙個和c++中方法對應的方法,以便在c#中呼叫,我們定義三個委託來完成這件事:

public

delegate

int max(int a, int

b);

public

delegate

int min(int a, int

b);

public

delegate

int sum(int a, int b);

private

int dllhandle = 0

;

public

max promax

public

min promin

public

sum prosum

//獲取dll中的介面位址

private

static delegate getaddress(int dllmodule, string

functionname, type t)

public

void

freelinbary()

}//////

載入dll

/// ///

是否載入dll成功

public

int loaddll(string

dllpath)

else

}

整個呼叫流程比較簡單,在c#呼叫c++寫的dll過程中,關鍵是引數型別的對應方面容易出錯,c++中的資料型別和c#中還是有些區別的,比如char在c#中是兩個位元組,在c++是乙個位元組。在c++中使用了指標,在c#中同樣需要使用intptr獲取其指標位址。

C 呼叫 C dll的兩種方式

第一種,非託管方式 呼叫類和方法 非託管方式,只能呼叫函式,並且函式在extern c 的體裡面 有一下幾種方式,把函式都寫了,把介面寫了。建立物件的方法 extern c exampleunmanageddll api cunmanagedtestclass createtestclass 釋放 ...

編寫C 呼叫的C DLL

最近一段時間,經常遇到這些問題,前一陣子研究了一下,沒有記下來,沒想到最近研究又有些不記得了,今天把它寫下來以備忘。一般我們提供給其他語言呼叫的dll,都是用c或者c 編寫,然後封裝。我這邊也是採用的c 首先有幾個注意點 1 如果功能很簡單,或者不使用第三方庫 如mfc自帶的庫 建立乙個win32的...

c 呼叫C dll 的方法

c 呼叫c dll 的方法 1.新增 using system.runtime.interopservices 2.將dll 放到執行程式的根目錄下 3.c 中可識別的字元為 utf8,在傳輸字元的時候,需要先轉換為utf8,然後再傳輸,要不然中文會識別不了,同樣在返回資料的時候,也需要將utf8轉...