1. 程式人生 > >Swig將C++編譯lib專案轉換為C#可引用的dll[勘誤後]

Swig將C++編譯lib專案轉換為C#可引用的dll[勘誤後]

Swig將C++編譯lib專案轉換為C#可引用的dll

swig是一個工具,可以將c,c++程式碼轉換成c#,java,perl,tcl,ruby等等語言,官網介紹如下

個人目標:c++ lib 專案轉成c#可直接引用的dll

從頭講起,以下皆使用VS2008

1. 建立和編譯C++ lib專案

1.1 啟動VS2008,新建專案->選擇Win32專案(專案名:lib-test)->選擇靜態庫lib

1.2 解決方案資源器中選擇專案,右鍵選擇新增類->c++->輸入類名libXiao等,一路next,自動生成libXiao.hlibXiao.cpp

1.3 .h中加入

intadd(int i,int j);宣告,

.cpp中加入add函式實現程式碼:

int libXiao::add(int i,int j)

{

              returni+j;

}

1.4生成解決方案,得到lib-test.lib檔案

接下來需要兩個專案來完成轉化,其中,一個專案(C++dll專案型別)利用swig來生成C#類檔案和C++ dll,另一個專案(C#類庫專案型別)利用生成的前一個專案生成的dllC#檔案來生成可以被其他C#專案可以直接引用的dll

2. 使用swig生成C#類檔案和C++ dll

2.1啟動VS2008,新建專案->選擇Win32

專案(專案名:swig-test)->選擇dll

2.2在專案屬性->配置屬性->C/C++->預編譯頭->建立/使用預編譯頭,選擇不使用預編譯頭

2.3在本地建立一個test.i檔案(可新建一個.txt檔案再修改後綴名實現)

2.4 解決方案資源器中選擇資原始檔,右鍵選擇新增現有項,新增剛生成的.i檔案(當彈出“未找到匹配的自定義生成規則”對話方塊時選擇“否”按鈕,不建立規則)

2.5編輯test.i檔案

%module Test 

%include <windows.i>

%{

#include"libXiao.h"//注意:以#而非%開始

%}

%include "E:/Mine/lib-test/lib-test/libXiao.h"//

注意:以%而非#開始

2.6 在專案屬性->配置屬性->預生成事件->命令列中輸入:

swig -c++ -csharp -o test_wrap.cpp -namespace"Xiao.Test" -dllimport swig-test test.i

如果打算將產生出來的檔案自動新增到“將dll編譯成可被C#呼叫的dll的專案”中去,可以使用下面的命令列:swig-c++ -csharp -o test_wrap.cpp -namespace "Xiao.Test" -outdir$(SolutionDir)ClassLibrary1 -dllimport swig-test test.i

注意:$(SolutionDir)ClassLibrary1為接下來使用的c#的專案的路徑,根據自己情況決定。-dllimportswig-test 的引數值為dll的名稱,這點需要注意,如果%moduledll名稱一致則不需要此引數,這個會影響生成的c#類檔案中的dllImport的名稱,如 [DllImport("swig-test",EntryPoint="SWIGRegisterExceptionCallbacks_Test")]

2.7 在專案屬性->配置屬性->連結器->輸入->附屬依賴項中輸入lib-test.lib的全路徑:D:\MyProject\lib-test\Debug。如果將lib-test.lib拷貝到當前目錄下就不需要全路徑了。

2.8生成解決方案,會自動生成test_wrap.cpp

2.9解決方案資源器中選擇原始檔,新增test_wrap.cpp,生成解決方案

2.10生成了swig-test.dlllibXiao.cs,Test.cs,TestPINVOKE.cs

3. 利用生成的dllC#檔案來生成其他C#專案可以直接引用的dll

3.1可以在2中的解決方案中新增一個C#專案,型別為類庫,專案名ClassLibrary1

3.2刪除專案預設生成的cs檔案

3.3新增2中生成的所有產出:swig-test.dlllibXiao.csTest.csTestPINVOKE.cs

3.3修改專案屬性->應用程式->預設名稱空間為Xiao.Test,修改專案屬性->應用程式->程式集名稱為test

3.4生成解決方案,得到test.dll檔案

 4.C# .Net平臺下使用經過託管的test.dll和非託管的swig-test.dll

至此所有的工作就已經完成了,接下來就可以新增引用test.dllc#專案中使用

using Xiao.Test;

Xiao.Test.libXiao l = new libXiao();

int i = l.add(1, 12);

Console.WriteLine(i);

需要注意的是由於test.dll依賴於swig-test.dll。這個C++生成的dll所以我們使用的時候需要把swig-test.dll能讓程式訪問,可以把它放到程式執行的當前目錄下或者system32或者環境變數包括的路徑中。