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