由於c#編寫的是託管**,編譯生成微軟中間語言,而c++**則編譯生成本地機器碼(這種c++也有叫做本地c++或者非託管c++,vc6.0就是用於開發非託管c++**的平台),這兩種語言進行混合程式設計就存在一定困難。比較常用的方法是使用dllimport的方法,這種方法在網上有很多介紹,這裡就不詳細敘述了。但是用過這種方法的人都知道這種方法對於匯出函式還可以但是卻沒法匯出非託管
c++類!非常的要命。
最近我在做乙個專案的時候就遇到了需要在c#**中使用非託管
c++類的問題,在對收集到的資料(大部分就來自csdn)的學習中還真找到了一種方法能夠匯出非託管
c++**的類給c#呼叫。現在刪繁就簡地做個學習總結,也算是為了給遇到相似問題的同道們提供乙個參考吧。
以上已經說過為什麼c#想要直接呼叫非託管c++類很困難。然而,除了c#、非託管c++外,c系列中還存在一種語言(個人看法)叫做託管c++,這種語言語法上和非託管
c++幾乎一樣,但是卻和c#一樣編譯成為微軟中間語言,這樣託管c++就可以和c#良好地通訊,即可以在c#中使用託管c++類。另外,託管c++還有兩個及其重要的特性就是:可以呼叫非託管c++的類和函式!託管c++的程式集可以巢狀非託管
c++編譯的機器碼!好強大的混合體。所以我們的技術路徑也就明晰了:c#以託管c++為中介呼叫非託管
c++的類和函式。換句話說也就是用託管c++給非託管
c++**做乙個外殼包裝供c#呼叫。
我們的例子是將乙個函式簽名為int add(int a,int b)的c函式和乙個非託管c++類class cclassnative匯出,最終在c#中使用。
為實現這個目的我們建立乙個工程來演示。
一.準備用於匯出的類和函式。
1)新增functions.h
檔案和functions.cpp
檔案,在functions.h
中定義方法
intadd(int a,int b);在functions.cpp
編寫實現add(int a,int b),**:
functions.h
檔案:[cpp]view plain
copy
//這裡定義用於匯出的c函式
intadd(
inta,
intb);
functions.h
檔案:[cpp]view plain
copy
#include "stdafx.h"
#include "functions.h"
//這裡實現c函式(算術加法)
intadd(
inta,
intb)
2)新建c++
非託管類cclassnative
在classnative.h
中定義類:
[cpp]view plain
copy
#pragma once
class
cclassnative
; 在classnative.cpp
中編寫**:
[cpp]view plain
copy
#include "stdafx.h"
#include "classnative.h"
cclassnative::cclassnative(void
)
cclassnative::~cclassnative(void
)
//這是非託管c++類實現的算術減法
intcclassnative::menderfuncsub(
inta,
intb)
這樣非常簡單的非託管c++類和函式就準備好了,現在我們就需要使用託管c++對這些類和函式進行包裝了。
二.使用託管c++包裝非託管c++類和c函式。
3)新建類託管類clrclass
在clrclass.h
檔案裡定義:
[cpp]view plain
copy
#pragma once
#include "classnative.h"
//這是個託管c++類用於對c++本地**類和函式等進行封裝以在c#中使用
public
ref
class
clrclass
; 在clrclass.cpp
檔案裡編寫:
[cpp]view plain
copy
#include "stdafx.h"
#include "clrclass.h"
#include "functions.h"
clrclass::clrclass(void
)
//通過呼叫非託管類cclassnative的減法函式實現算術減法
intclrclass:: menderfuncsub(
inta,
intb)
//通過呼叫c函式實現算術加法
intclrclass:: menberfuncadd(
inta,
intb)
三.在c#中包裝好的本地c++類和c函式。
由於c#估計大家都比較熟悉了,其他步驟就省略,只列出建立clrclass類物件和圖中兩個按鈕的事件處理函式,如下:
[csharp]view plain
copy
///
/// 這是使用託管c++對c函式和c++類建立的包裝,本質上是乙個託管類的物件
///
clrclass clrclass = new
clrclass();
///
/// 加法
///
///
///
private
void
button_aaddb_click(
object
sender, eventargs e)
///
/// 減法
///
///
///
private
void
button_asubb_click(
object
sender, eventargs e)
這是執行效果:
以上只是乙個簡單的例子,實際上,用託管c++包裝的可以是任何本地c++的**,包括mfc庫(這個本人實驗過)。
以上示例的開發環境是vs2010,windows版本是windows7旗艦版。
在非託管C 中使用GDI
微軟說,gdi 可以在所有基於windows的應用程式中使用,包括64位的windows版本 不包括win3.x 你只需要把gdiplus.dll拷入windows的系統目錄,即可使用需要gdi 支援的應用程式。在非託管的c 中使用,你只需要包含gdiplus.h標頭檔案,然後在連線設定包含gdip...
如何在C 中使用WebService
將他解壓後,進入到資料夾 gsoap 2.8.18 gsoap 2.8 gsoap bin win32 裡面有2個我們要用到的exe,wsdl2h.exe和soapcpp2.exe,如果缺少乙個typemap.dat,則從gsoap 2.8.18 gsoap 2.8 gsoap下拷貝進來,最後就可以...
如何在 C 中使用 RabbitMQ
rabbitmq 是乙個非常流行的,開源的,使用erlang語言編寫的框架,通常在電信級平台中作為訊息中介軟體使用,rabbitmq實現了高階的amqp協議用於實現程序間,應用程式間,伺服器之間的訊息互動,而且它還有乙個非常?的特性,你可以使用自定義外掛程式來擴充套件rabbitmq的功能,而且它還...