第一種,非託管方式:呼叫類和方法
非託管方式,只能呼叫函式,並且函式在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#中呼叫
publicclass
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 屬性定義
如下:
namespacesystem.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...