日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

封装时间转换工具类_利用swig封装C++的dll为C#方便使用

發布時間:2023/12/20 C# 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 封装时间转换工具类_利用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.net

swig是將C++原始代碼,包裝成一個方便其他語言調用的工具。

swig轉C#主要做兩步操作:

  • 將C++代碼進行一次封裝,生成wrap未文件名結尾的C++文件,這些warp文件中會創建一些新的方法,這些新方法是對于開發人員而言是透明的,它們不是給開發人看的,而是給其他語言使用的。生成的dll中包含這些新方法。
  • 同時生成C#對應的類文件,這些類文件需要拷貝到C#項目中,這些類對應于原始C++中的類名和方法名,這樣就可以做到在C#中訪問和原始C++項目中一樣的類和方法。 實際上這一步做的工作就是調用上一步產生的wrap中的方法,wrap中的方法再去調用原始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.idl

    step 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庫進行多態回調。
    class ChildMethod : Addmethod{public override int add(int i,int j){return (i+j)*100;}}class Child:CPlusPlusClass{public string showChild(){return ("child");}}private void button3_Click(object sender, EventArgs e){Addmethod method = new ChildMethod();Child child = new Child();richTextBox1.Text += DateTime.Now.ToLongTimeString() + " " + child.Add(3, 3, method)+ "n";}

    總結

    整體而言,利用swig封裝C++為C#的調用方式,可以極大的減輕工作量,同時方便后續高效率的開發使用原先的C++庫。

    總結

    以上是生活随笔為你收集整理的封装时间转换工具类_利用swig封装C++的dll为C#方便使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。