**:
由於歷史原因,很多時候我們的**並不完全是使用.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 ...