C 和C 混合程式設計

2021-06-20 14:09:57 字數 2142 閱讀 5201

**:

由於歷史原因,很多時候我們的**並不完全是使用.net寫成的。這時候和以往c++**的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。

要在c#**中呼叫c++函式,大體的思路是這樣的:首先將c++函式寫成dll形式的庫,然後在c#中匯入dll中的函式進行呼叫。具體的**類似這樣:

c++**:

1int

staticelementnumber =10

;2extern"c

"afx_api_export

intgetarrayelementnumber()3

c#**:

(匯入函式部分,寫在呼叫函式所在類中)

1[dllimport(

"mfcdll.dll")]

2public

static

extern

intgetarrayelementnumber();

3int

elementnumber

=getarrayelementnumber();

s其中的細節,比如int和char等資料型別在c++和c#中占用的空間不同等等clr會自動處理。(主要是通過marshal類自動處理)

這樣的呼叫還支援除錯。開啟c#工程的properties,在debug選項卡中勾選enable unmanaged code debugging即可啟用c++**除錯。這樣在除錯模式下,呼叫這個函式時可以繼續按f11跟進函式內部進行除錯。

一些複雜的windows物件可以通過控制代碼來傳送。比如下面的**就將乙個gdi+ bitmap物件轉換成gdi控制代碼進行傳送。

c++**(gdi+的宣告,引用等等省略):

1extern"c

"afx_api_export hbitmap getabitmap(wchar

*strfilename)2

1[dllimport(

"mfcdll.dll")]

2public

static

extern

intptr getabitmap([marshalas(unmanagedtype.lpwstr)]

string

strfilename);34

private

void

menuitemfileopenonclicked(

object

sender, routedeventargs e)522

} 傳遞定長陣列很簡單,此處不述。下面的**實現變長陣列的傳遞:

c++**:

1int

staticelementnumber =10

;2extern"c

"afx_api_export

bool

getarray(

intelementnumber,

double

*baseaddress)3

89for(

inti =0

; i

<

staticelementnumber;

++i)10

1314

return

true;15

} 16

17extern"c

"afx_api_export

intgetarrayelementnumber()18

c#**:  

1[dllimport(

"mfcdll.dll")]

2public

static

extern

bool

getarray(

intelementnumber, [marshalas(unmanagedtype.lparray, sizeparamindex =0

)] double

baseaddress);34

private

void

menuitemfilegetarrayonclicked(

object

sender, routedeventargs e)518

maingrid.children.add(listbox);

19} 20

有了這三個功能,一般來說c++**復用到c#平台上就是比較簡單的事情了。

C 和C 混合程式設計

由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1 int...

C和C 混合程式設計

1 pragma once 關於 pragma once vc 及g 都支援,大膽的用吧。匯出型別必須一致.要麼是c的,要麼是c 2.cplusplus 這個是必須的 ifdef cplusplus extern c endif c 中呼叫c的 1 對於 c 中非類的成員函式,可以簡單的在函式宣告前...

C和C 混合程式設計

如何用c語言封裝 c 的類,在 c裡面使用 stm32 c與c 混合開發 在嵌入式領域,c和c 混合程式設計還是很常見的 一 c 呼叫c的函式 這個很簡單,把c檔案對應的 件,全部用extern c 包起來就是了 ifdef cplusplus extern c endif二 c呼叫c 的函式 1 ...