Swig将C++编译lib项目转换为C#可引用的dll[勘误后]

本文详细介绍了如何使用SWIG工具将C++库项目转换为C#可直接引用的DLL,并通过VS2008完成整个过程。包括建立C++库项目、使用SWIG生成C#类文件和C++ DLL、利用生成的DLL和C#文件生成可供其他C#项目引用的DLL,以及在C#环境下调用C++库的完整步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Swig将C++编译lib项目转换为C#可引用的dll

swig是一个工具,可以将c,c++代码转换成c#,java,perl,tcl,ruby等等语言,官网介绍如下

http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn2

个人目标: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或者环境变量包括的路径中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值