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.h和libXiao.cpp
1.3 在.h中加入
在.cpp中加入add函式實現程式碼:
int libXiao::add(int i,int j)
{
returni+j;
}
1.4生成解決方案,得到lib-test.lib檔案
接下來需要兩個專案來完成轉化,其中,一個專案(C++dll專案型別)利用swig來生成C#類檔案和C++ dll,另一個專案(C#類庫專案型別)利用生成的前一個專案生成的dll和C#檔案來生成可以被其他C#專案可以直接引用的dll。
2. 使用swig生成C#類檔案和C++ dll
2.1啟動VS2008,新建專案->選擇Win32
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的名稱,這點需要注意,如果%module跟dll名稱一致則不需要此引數,這個會影響生成的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.dll和libXiao.cs,Test.cs,TestPINVOKE.cs
3. 利用生成的dll和C#檔案來生成其他C#專案可以直接引用的dll
3.1可以在2中的解決方案中新增一個C#專案,型別為類庫,專案名ClassLibrary1
3.2刪除專案預設生成的cs檔案
3.3新增2中生成的所有產出:swig-test.dll,libXiao.cs,Test.cs和TestPINVOKE.cs
3.3修改專案屬性->應用程式->預設名稱空間為Xiao.Test,修改專案屬性->應用程式->程式集名稱為test
3.4生成解決方案,得到test.dll檔案
4.在C# .Net平臺下使用經過託管的test.dll和非託管的swig-test.dll
至此所有的工作就已經完成了,接下來就可以新增引用test.dll到c#專案中使用
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或者環境變數包括的路徑中。