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ù)免費閱讀

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論