1、 直接呼叫c++類庫中的公共方法
extern"c__stdcall表示呼叫約定:引數都是從右向左通過堆疊傳遞, 函式呼叫在返回前要由被呼叫者清理堆疊。" __declspec(dllexport) int __stdcall add(int n1, int n2);
在c#中,呼叫如下:
[dllimport("")]注意引數的型別,之後,可直接在c#程式設計中使用這個方法。private
static
extern
int add(int n1, int n2);
2、 呼叫c++類庫中的類的方法
c#不能直接呼叫c++類庫中的類,需要一種變通的解決方式,通過再做乙個c++類庫把要呼叫的類成員方法暴露出來,比如下面這個c++類:
samplecppclass.h
#pragma oncesamplecppclass.cppclass
__declspec(dllexport) samplecppclass
;
#include "我們要呼叫samplecppclass中的add和sub兩個方法,所以我們再寫乙個c++類庫,通過公共方法間接呼叫類成員方法:samplecppclass.h
"samplecppclass::samplecppclass(
void
)samplecppclass::~samplecppclass(void
)int samplecppclass::add(int n1, int
n2)int samplecppclass::sub(int n1, int
n2)
#pragma once#include"..\samplecppclass\samplecppclass.h
"namespace
#include ""namespace
int __stdcall sub(int n1, int
n2)
}
[dllimport("")]3、 使用c++類庫中的**函式private
static
extern
int add(int n1, int
n2);
[dllimport(""
)]private
static
extern
int sub(int n1, int n2);
c++的**函式是一種事件響應機制,和c#的委託相似,比如乙個c++類中的**函式:
samplecppclass.h
#pragma oncetypedefsamplecppclass.cppvoid (*loopcallback)(void*pcontext);
class
__declspec(dllexport) samplecppclass
;
#include "我們通過c++再寫乙個類庫進行封裝,把類中的方法暴露出來:samplecppclass.h
"samplecppclass::samplecppclass(
void
)samplecppclass::~samplecppclass(void
)void
samplecppclass::setcallbackfunc(loopcallback callback)
void samplecppclass::setcallbackcontext(void*pcontext)
void
samplecppclass::loop()}}
#pragma once#include"..\samplecppclass\samplecppclass.h
"namespace
#include "然後,在c#中進行呼叫:"namespace
void __stdcall setcallbackcontext(void*pcontext)
void
__stdcall loop()
void loopcallbackfunc(void*pcontext)}}
usingsystem;
using
system.runtime.interopservices;
using
system.windows.forms;
namespace
samplecstest
}private
delegate
void
loopcallbackhandler(intptr pcontext);
private
static loopcallbackhandler callback =loopcallback;
[dllimport(""
)]
private
static
extern
void
setcallbackfunc(loopcallbackhandler callback);
[dllimport(""
)]
private
static
extern
void
setcallbackcontext(intptr pcontext);
[dllimport(""
)]
private
static
extern
void
loop();
private context ctx = new
context();
public
form1()
private
void form1_load(object
sender, eventargs e)
private
void button1_click(object
sender, eventargs e)
private
static
void
loopcallback(intptr pcontext)}}
C 呼叫外部exe的幾種方式
using system.diagnostics process p process.start program.exe p.waitforexit 本行 不是必須,但是很關鍵,限制等待外部程式退出後才能往下執行當exe程式需要傳遞引數時 using system.diagnostics proce...
C 呼叫C 類庫2
前文 為了測試c 呼叫的c 類庫需要呼叫其他c 類庫的情況 也不知道是不是應該這樣形容,如下圖,目的是呼叫cameracontrol.devices,但是其需要呼叫下面兩個庫 對前乙個專案進行一些修改 1.解決方案 新增 新建專案 類庫 net framework 新增csharptestdll2 ...
使用C 呼叫C 類庫
1.使用c 編寫乙個動態庫 dll 2.將dll內函式匯出 3.使用c 進行呼叫 4.方法呼叫 5.在vs進行除錯 1.1建立專案 x64 在vs2017中新建 專案 visual c windows桌面 動態鏈結庫 在專案屬性中 常規中選擇無公共語言支援,即不建立託管c 類庫 1.2新增類和方法 ...