C 呼叫C 類庫的幾種方式

2022-09-08 17:03:11 字數 3315 閱讀 4995

1、  直接呼叫c++類庫中的公共方法

extern"c

" __declspec(dllexport) int __stdcall add(int n1, int n2);

__stdcall表示呼叫約定:引數都是從右向左通過堆疊傳遞, 函式呼叫在返回前要由被呼叫者清理堆疊。

在c#中,呼叫如下:

[dllimport("")]

private

static

extern

int add(int n1, int n2);

注意引數的型別,之後,可直接在c#程式設計中使用這個方法。

2、  呼叫c++類庫中的類的方法

c#不能直接呼叫c++類庫中的類,需要一種變通的解決方式,通過再做乙個c++類庫把要呼叫的類成員方法暴露出來,比如下面這個c++類:

samplecppclass.h

#pragma once

class

__declspec(dllexport) samplecppclass

;

samplecppclass.cpp

#include "

samplecppclass.h

"samplecppclass::samplecppclass(

void

)samplecppclass::~samplecppclass(void

)int samplecppclass::add(int n1, int

n2)int samplecppclass::sub(int n1, int

n2)

我們要呼叫samplecppclass中的add和sub兩個方法,所以我們再寫乙個c++類庫,通過公共方法間接呼叫類成員方法:

#pragma once#include 

"..\samplecppclass\samplecppclass.h

"namespace

#include "

"namespace

int __stdcall sub(int n1, int

n2)

}

[dllimport("")]

private

static

extern

int add(int n1, int

n2);

[dllimport(""

)]private

static

extern

int sub(int n1, int n2);

3、  使用c++類庫中的**函式

c++的**函式是一種事件響應機制,和c#的委託相似,比如乙個c++類中的**函式:

samplecppclass.h

#pragma oncetypedef 

void (*loopcallback)(void*pcontext);

class

__declspec(dllexport) samplecppclass

;

samplecppclass.cpp

#include "

samplecppclass.h

"samplecppclass::samplecppclass(

void

)samplecppclass::~samplecppclass(void

)void

samplecppclass::setcallbackfunc(loopcallback callback)

void samplecppclass::setcallbackcontext(void*pcontext)

void

samplecppclass::loop()}}

我們通過c++再寫乙個類庫進行封裝,把類中的方法暴露出來:

#pragma once#include 

"..\samplecppclass\samplecppclass.h

"namespace

#include "

"namespace

void __stdcall setcallbackcontext(void*pcontext)

void

__stdcall loop()

void loopcallbackfunc(void*pcontext)}}

然後,在c#中進行呼叫:

using

system;

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新增類和方法 ...