封装时间转换工具类_利用swig封装C++的dll为C#方便使用
使用C++開發(fā)界面,時間效率上來說,不如C#開發(fā)的快和方便。但是CTP的庫是C++的,并沒有C#的庫,網(wǎng)上也有人用C#的PINVOKE的方式將C++的函數(shù)一個個轉(zhuǎn)換為C#能用的接口,我是看了下,原理ok,但是真心轉(zhuǎn)換起來工作量太大了。
借鑒
swig把CTP轉(zhuǎn)java?blog.csdn.net這篇文章,我想swig轉(zhuǎn)C#這個方式應(yīng)該更容易,于是今天先寫一個demo,然后嘗試著轉(zhuǎn)轉(zhuǎn)看。先參考如下的一個基礎(chǔ)例子。
swig轉(zhuǎn)C#?blog.csdn.netswig是將C++原始代碼,包裝成一個方便其他語言調(diào)用的工具。
swig轉(zhuǎn)C#主要做兩步操作:
但是現(xiàn)在還有一個問題:
以上C#的例子中,沒有繼承實現(xiàn)和回調(diào)這兩種實現(xiàn)。只有解決了這兩個問題,才能進一步轉(zhuǎn)換CTP的類庫。
首先得解決這個,于是自己在其基礎(chǔ)上,按照如下7步驟生成一個可以被C#方便使用的C++的dll。
一、利用Swig生成C#方便使用的DLL
step 1 : 創(chuàng)建了如下項目,一個C++動態(tài)鏈接庫的項目,一個C#桌面應(yīng)用程序。
step 2 :其中c++_file.idl文件內(nèi)容如下,這個文件是swig轉(zhuǎn)換規(guī)則的定義文件,同時,要修改該文件屬性,否則項目編譯會把該文件也編譯進去,會報錯的。右鍵該文件屬性:項類型->自定義生成工具。
%module(directors = "1") cppdll /*directors = "1",才可以使用虛函數(shù)的多態(tài)特性,否則只能繼承,不能多態(tài)*/ %{ /* 在包裝代碼中包含頭文件 */ #include "c++_file.h" %} %feature("director") Addmethod; /*需要指明多態(tài)的類,若module(directors = "1")未聲明,則此處沒有意義*//* 解析頭文件生成包裝代碼 */ %include "c++_file.h"step 3 :c++_file.h
#pragma once class Addmethod { public:virtual int add(int a, int b) { return 0; };virtual ~Addmethod() {} };class CPlusPlusClass { public://加法計算實際上是通過Addmethod.add實現(xiàn)int Add(int a,int b,Addmethod* method); };step 4 :C++_project.cpp
// C++_project.cpp: 定義 DLL 應(yīng)用程序的導(dǎo)出函數(shù)。 //#include "stdafx.h" #include "c++_file.h" int CPlusPlusClass::Add(int a, int b,Addmethod* method) {if(method)return method->add(a,b);else return a + b; }step 5 :以上代碼寫好后,就可以使用swig進行轉(zhuǎn)換了,命令行切換到項目c++_file.idl所在目錄,輸入如下命令,(swig已經(jīng)加到系統(tǒng)的環(huán)境變量中才可以直接使用命令,否則需要全路徑)
swig -c++ -csharp c++_file.idlstep 6 :運行沒有報錯,則會生成如下文件,將其中后綴為.cs的文件全部拷貝到C#項目中。
step 7 :在C++_project項目上,會看到debug目錄下有生成一個C++_project.dll文件。將該文件拷貝到C#項目的debug目錄下。
二、C#使用上述DLL
在C#項目中,使用代碼如下:
- 創(chuàng)建子類ChildMethod 繼承C++的Addmethod類,并重寫方法add
- 創(chuàng)建子類Child類,繼承C++中的CPlusPlusClass類,并新增方法showChild
- 調(diào)用child對象,并將childMethod對象傳入,以便C++的dll庫進行多態(tài)回調(diào)。
總結(jié)
整體而言,利用swig封裝C++為C#的調(diào)用方式,可以極大的減輕工作量,同時方便后續(xù)高效率的開發(fā)使用原先的C++庫。
總結(jié)
以上是生活随笔為你收集整理的封装时间转换工具类_利用swig封装C++的dll为C#方便使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12伏的蓄电池有几个单格组成_福建汤浅蓄
- 下一篇: 复制的时候提示下标越界_移动硬盘打不开提