動態鏈結庫(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,intb)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#中呼叫,我們定義三個委託來完成這件事:
publicdelegate
int max(int a, int
b);
public
delegate
int min(int a, int
b);
public
delegate
int sum(int a, int b);
privateint 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轉...