C#調(diào)用C++編程技術(shù)研究.doc_第1頁
C#調(diào)用C++編程技術(shù)研究.doc_第2頁
C#調(diào)用C++編程技術(shù)研究.doc_第3頁
C#調(diào)用C++編程技術(shù)研究.doc_第4頁
C#調(diào)用C++編程技術(shù)研究.doc_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C#調(diào)用C+編程技術(shù)研究由于歷史原因,很多時(shí)候我們的代碼并不完全使用.NET寫成。這時(shí)候和以往C+代碼的混合編程就顯得相當(dāng)重要了。理論上,C#調(diào)用C+有如下3種方式:1)將本機(jī)C+代碼(指非托管C+)編譯成一個(gè)dll,供C#調(diào)用,調(diào)用方法為DllImport(.dll)。但是這里只能從DLL導(dǎo)出函數(shù),不能導(dǎo)出類(還沒有測(cè)試能否導(dǎo)出變量)。不能導(dǎo)出類是因?yàn)楸緳C(jī)C+是非托管的,與C#的語言方式不兼容。也就是說,不能將此類dll作為引用添加到C#工程中,IDE會(huì)提示不是一個(gè)程序集。2)利用CLR C+(指托管C+)編寫輸出類庫,供C#使用,由于CLR C+和C#都符合CLS規(guī)范,所以兩者可以無縫集成,在一個(gè)解決方案里包含這兩種語言的項(xiàng)目。生成的DLL可以導(dǎo)出類。但是CLR C+與傳統(tǒng)C+有很大的區(qū)別,可以認(rèn)為是另一種不同的語言,學(xué)習(xí)它也要話費(fèi)很大的精力,所以這種方法也有些麻煩。CLR C+不兼容本機(jī)C+的很多內(nèi)容,但可以利用指針來操作。3)利用CLR C+把本機(jī)C+代碼包裝起來,做一個(gè)wrapper。這種方法比較好,而且在設(shè)計(jì)模式里還有一個(gè)專門的名稱。首先創(chuàng)建一個(gè)C#項(xiàng)目寫界面,然后添加一個(gè)CLR C+類庫項(xiàng)目和一個(gè)本機(jī)C+ DLL項(xiàng)目。本機(jī)C+ DLL項(xiàng)目里面是算法代碼,可以導(dǎo)出類;在CLR C+類庫項(xiàng)目里寫一個(gè)類,私有成員為本機(jī)C+類的指針(不能用類的實(shí)例,因?yàn)镃LS不支持混合類型),公共成員為本機(jī)C+ DLL類中的相應(yīng)功能。C#調(diào)用CLR C+類,CLR C+類再調(diào)用本機(jī)C+類,表示如下:Native C+ = Managed C+ Wrapper = C# GUI一、 基于托管C+包裝器的混合語言編程如前所述,C+直接生成本地機(jī)器碼,C#是生成微軟中間語言的托管代碼,想要直接調(diào)用是不可能的。事實(shí)上,C系列中還存在一種語言叫做托管C+,這種語言語法上和C+幾乎一樣,但是卻和C#一樣編譯成為微軟中間語言,這樣就可以和C#良好地通信,即可以在c#中使用托管C+類。另外,托管C+還有及其重要的兩個(gè)特性就是:可以調(diào)用本地C+的類和函數(shù)!一個(gè)托管C+的程序集可以嵌套本地C+編譯的機(jī)器碼!好強(qiáng)大的混合體。所以我們的技術(shù)路徑也就明晰了:C#以托管C+為中介調(diào)用本地C+的類和函數(shù)。換句話說也就是用托管C+給本地C+代碼做一個(gè)外殼供C#調(diào)用。編程案例:將一個(gè)函數(shù)簽名為int Add(int a,int b)的C函數(shù)和一個(gè)C+本地類class CClassNative導(dǎo)出,最終在C#中使用。CClassNative類的定義如下:class CClassNativepublic:CClassNative(void);CClassNative(void);int menber;/成員int menderFuncSub(int a,int b);/成員函數(shù);編程步驟如下:1、創(chuàng)建用于導(dǎo)出的類和函數(shù)1)打開VS2010,創(chuàng)建VC+的Win32項(xiàng)目:ExampleForC+為了確保調(diào)用成功,這里可以將工程創(chuàng)建為DLL庫。通過試驗(yàn),將程序創(chuàng)建成Windows應(yīng)用程序,在編譯成功后,再修改配置類型為.dll也是可以的。2)編寫C函數(shù)的實(shí)現(xiàn)在解決方案資源管理器下,選擇項(xiàng)目,右單擊,添加類在彈出的界面中,選擇創(chuàng)建C+類隨后,輸入類名:Functions,開發(fā)工具會(huì)自動(dòng)為我們生成2個(gè)文件:Functions.h、Functions.CPP注意:這里我們需要?jiǎng)?chuàng)建的是一個(gè)C函數(shù)的實(shí)現(xiàn),而不是一個(gè)類。之所以選擇創(chuàng)建C+類,是因?yàn)檫@樣可以快速地自動(dòng)生成Functions.h和Functions.CPP這2個(gè)文件。在C+工程中,.h文件負(fù)責(zé)頭文件定義,.CPP負(fù)責(zé)函數(shù)實(shí)現(xiàn)方法的定義。完成上述操作后,打開Functions.h,編輯如下:#pragma once/這個(gè)函數(shù)用于導(dǎo)出C函數(shù),實(shí)現(xiàn)算術(shù)加法#include stdafx.hint Add(int a,int b);打開Functions.CPP,編輯如下:#include StdAfx.h#include Functions.h/這是C函數(shù)實(shí)現(xiàn)的算術(shù)加法int Add(int a,int b)return a+b;編譯,程序顯示成功!3)新建C+本地代碼類CClassNative類似的方法,在工程中新建一個(gè)C+類:CClassNative,其頭文件ClassNative.h定義如下:#pragma onceclass CClassNativepublic:CClassNative(void);CClassNative(void);int menber;/用于導(dǎo)出的成員int menderFuncSub(int a,int b);/ 用于導(dǎo)出的成員函數(shù),實(shí)現(xiàn)算術(shù)減法;類的實(shí)現(xiàn)ClassNative.CPP定義如下:#include StdAfx.h#include ClassNative.h/構(gòu)造函數(shù)CClassNative:CClassNative(void)menber=1;CClassNative:CClassNative(void)/這是本地C+類實(shí)現(xiàn)的算術(shù)減法int CClassNative:menderFuncSub(int a,int b)return a-b;編譯顯示成功!2、編寫托管C+,包裝本地C+類和C函數(shù)1)修改編譯選項(xiàng)為了使用托管C+,需要改編譯選項(xiàng):?jiǎn)螕簟癊xampleForC+”項(xiàng)目,在快捷方式里選“屬性”,將“配置屬性”-“常規(guī)”-“公共語言運(yùn)行時(shí)支持”選擇為“公共語言運(yùn)行時(shí)支持(/clr)”。2)新建一個(gè)C+類clrClass這是一個(gè)托管C+類,用于對(duì)C+本地代碼類和函數(shù)等進(jìn)行封裝,并在C#中使用的一個(gè)包裝類(Wrapper)。類clrClass的頭文件clrClass.h定義如下:#pragma once/這是一個(gè)托管C+類,用于對(duì)C+本地代碼類和函數(shù)等進(jìn)行封裝,并在C#中使用的一個(gè)包裝類(Wrapper)#include ClassNative.h/類clrClass必須聲明為 public,否則類在程序集中不可見/關(guān)鍵詞 ref 表示類是一個(gè)托管類,將編譯為中間語言public ref class clrClasspublic:clrClass(void);int menber;/這個(gè)成員訪問CClassNative類的公共成員(事實(shí)上只需要包裝公共成員和公共成員函數(shù),私有的包裝沒有意義,也包裝不了)int menderFuncSub(int a,int b);/這個(gè)成員函數(shù)包裝CClassNative類的公共成員函數(shù)int menberFuncAdd(int a,int b);/這成員函數(shù)包裝C函數(shù) int Add(int a,int b)private:CClassNative * classNative;/建立一個(gè)本地類實(shí)例 (在構(gòu)造函數(shù)中實(shí)例化,這里可以理解為用于在clrClass 中“繼承”CClassNative的公共成員);類clrClass的實(shí)現(xiàn)clrClass.CPP定義如下:#include StdAfx.h#include clrClass.h#include Functions.hclrClass:clrClass(void)classNative=new CClassNative();/這里一定注意要?jiǎng)?chuàng)建對(duì)象!menber=classNative-menber;/這里是簡(jiǎn)單舉例,實(shí)際上應(yīng)該用屬性方法來讀寫CClassNative類的成員,同C#相似,托管C+中有屬性函數(shù),用法請(qǐng)自己查/通過調(diào)用CClassNative類實(shí)現(xiàn)算術(shù)減法int clrClass: menderFuncSub(int a,int b)return classNative-menderFuncSub(a, b);/通過調(diào)用C函數(shù)實(shí)現(xiàn)算術(shù)加法int clrClass: menberFuncAdd(int a,int b)return Add(a,b);編譯顯示成功!到此,就實(shí)現(xiàn)了clrClass對(duì)CClassNative類和C函數(shù)int Add(int a,int b)的托管包裝。最后,如果項(xiàng)目創(chuàng)建時(shí),選擇了Windows應(yīng)用程序,則這個(gè)時(shí)候需要修改配置類型。方法是:選擇項(xiàng)目ExampleForC+,右單擊,選擇“屬性”,在彈出的菜單中選擇:動(dòng)態(tài)庫(.dll)重新編譯,在ExampleForC+Debug目錄下生成的“ExampleForC+.dll”就可以直接在C#中調(diào)用了。3、在C#中調(diào)用包裝好的本地C+類和C函數(shù)為了測(cè)試調(diào)用效果,我們?cè)谶@個(gè)解決方案里新建一個(gè)C#項(xiàng)目:CallC+,步驟如下:1)新建C#項(xiàng)目:CallC+選擇“解決方案”,右單擊,“添加”“新建項(xiàng)目”在彈出的窗體中,創(chuàng)建一個(gè)C#的Windows窗體應(yīng)用程序:CallC+2)編輯主窗體為了調(diào)用C函數(shù)int Add(int a,int b)進(jìn)行加法運(yùn)算,調(diào)用類CClassNative的int menderFuncSub(int a,int b)成員函數(shù)進(jìn)行減法運(yùn)算,主窗體界面設(shè)計(jì)如下:3)添加引用在CallC+ Wrapper項(xiàng)目中,選擇“引用”,右單擊,添加引用。在彈出的窗體上,點(diǎn)擊“瀏覽”,選擇前期生成的動(dòng)態(tài)鏈接庫ExampleForC+.dll將其添加到工程中。4)函數(shù)調(diào)用為主窗體類聲明一個(gè)對(duì)象:clrClass ClrClass = new clrClass();添加如下按鈕響應(yīng)函數(shù):private void buttonAdd_Click(object sender, EventArgs e) int a = Convert.ToInt32(textBoxA.Text); int b = Convert.ToInt32(textBoxB.Text); /通過托管C+調(diào)用C函數(shù)int Add(int a,int b)實(shí)現(xiàn)的加法 textBoxRes.Text = ClrClass.menberFuncAdd(a, b).ToString();private void buttonSub_Click(object sender, EventArgs e) int a = Convert.ToInt32(textBoxA.Text); int b = Convert.ToInt32(textBoxB.Text); /通過托管C+調(diào)用C+的CClassNative類函數(shù)實(shí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論