C 呼叫 C dll的兩種方式

2022-07-17 07:09:11 字數 2948 閱讀 4566

第一種,非託管方式:呼叫類和方法

非託管方式,只能呼叫函式,並且函式在extern "c"的體裡面

有一下幾種方式,把函式都寫了,把介面寫了。

//

建立物件的方法

extern"c

" exampleunmanageddll_api cunmanagedtestclass*createtestclass()

//釋放

物件extern"c

" exampleunmanageddll_api void disposetestclass(cunmanagedtestclass*pobject)}//

呼叫函式

extern"c

" exampleunmanageddll_api void callpassint(cunmanagedtestclass* pobject, int

nvalue)}//

呼叫函式

extern"c

" exampleunmanageddll_api void callpassstring(cunmanagedtestclass* pobject, char*pchvalue);

extern"c

"

c++的呼叫

把生成的testclassdll.dll放到 bin/debug/下,然後在c#中呼叫

public

class

csunmanagedtestclass : idisposable

public

void

dispose()

protected

virtual

void dispose(bool

bdisposing)

if(bdisposing)

}//this finalizer is called when garbage collection occurs, but only if

//the idisposable.dispose method wasn't already called.

~csunmanagedtestclass()

public

void passint(int

nvalue)..

.

我手上有乙個c++寫的類(nativeclass),想在c#下呼叫這個類,可是c#是沒有簡單的像dllimport這樣的方法獲取非託管c++ dll裡的類。我的解決方法是,生成乙個託管c++的dll,然後在c#下引用這個dll。因為託管**與非託管**是不能在乙個檔案裡混編的,所以我必須將非託管c++寫的nativeclass用託管c++的手段封裝一下,然後生成乙個dll,以供c#呼叫。

:extern "c"包含雙重含義

extern "c"的使用要點總結

1,可以是如下的單一語句:

extern "c" double sqrt(double);

2,可以是復合語句, 相當於復合語句中的宣告都加了extern "c"

extern "c"

3,可以包含標頭檔案,相當於標頭檔案中的宣告都加了extern "c" 

extern "c"

要使用dllimport需要引用命名空間: system.runtime.interopservices;

dllimport 屬性定義

如下:

namespace

system.runtime.interopservices

//定位引數為dllname

public callingconvention callingconvention; //

入口點呼叫約定

public charset charset; //

入口點採用的字元接

public

string entrypoint; //

入口點名稱

public

bool exactspelling; //

是否必須與指示的入口點拼寫完全一致,預設false

public

bool preservesig; //

方法的簽名是被保留還是被轉換

public

bool setlasterror; //

findlasterror方法的返回值儲存在這裡

public

string value }

}}

說明:1、dllimport只能放置在方法宣告上。

2、dllimport具有單個定位引數:指定包含被匯入方法的 dll 名稱的 dllname 引數。

3、dllimport具有五個命名引數:

a、callingconvention 引數指示入口點的呼叫約定。如果未指定callingconvention,則使用預設值callingconvention.winapi。

b、charset引數指定用在入口點的字符集。如果未指定charset,則使用預設值charset.auto。

c、entrypoint引數給出dll中入口點的名稱。如果未指定entrypoint,則使用方法本身的名稱。

d、exactspelling引數指示entrypoint是否必須與指示的入口點的拼寫完全匹配。如果未指定exactspelling,則使用預設值false。

e、preservesig引數指示方法的簽名被保留還是被轉換。當簽名被轉換時,它被轉換為乙個具有hresult返回值和該返回值的乙個名為retval的附加輸出引數的簽名。如果未指定preservesig,則使用預設值true。

f、setlasterror引數指示方法是否保留win32「上一錯誤」。如果未指定setlasterror,則使用預設值false。

4、它是一次性屬性類。

5、用dllimport屬性修飾的方法必須具有extern修飾符。

C DLL匯出的兩種方式和鏈結的兩種方式

第一種 匯出方式 extern c declspec dllexport int plus int x,int y extern c declspec dllexport int sub int x,int y extern c declspec dllexport int mul int x,in...

C 呼叫C DLL的方式

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

C 中呼叫cmd兩種方式

兩種方式各有優缺,第一種方式不用exit,返回值中比較好處理,第二種方式對長 多 雜的命令支援比第一種好。在實際程式設計中根據具體的情況合理的選用,增加程式設計效率。第一種 public static string runcmd string command 第二種 public static st...