有没有人在 C# 中使用过SWIG库?如果有,您发现了哪些陷阱以及使用该库的最佳方式是什么?我正在考虑将它用作用 C 编写的程序的包装器,并且我想包装头文件,以便在我的 .NET 应用程序中使用它们。
编辑:对目标操作系统的一些说明。我计划在 Linux 和 Windows 上运行该应用程序,因此我正在研究 SWIG。P/Invoke 不是一个选项。
对于我的上一个项目,这是整个 C# SWIG 配置文件:
%module mdProject
%{
#include "mdProject.h"
%}
我在 SWIG 中编译它:
swig -csharp -c++ -I../../Include mdProject.i
这生成了一个 Project.cxx,我将其编译并直接链接到“主”DLL,因此我不需要第二个 C++“助手”DLL。SWIG 还生成了一堆我编译成 .NET DLL 的 C# 文件。我的其他包装器(Java、PHP 等)确实使用了辅助 DLL。
正如@patrick 所提到的,SWIG 使用 P/Invoke,所以如果您对此有疑问,您需要找到另一个解决方案。
如果您使用偏离普通类型(空隙、结构等)的类型,则必须做一些额外的工作才能使其正确,但对于使用 int、char* 等的普通 API,这很好。
我认为早期的海报所犯的错误是阅读文档而不是查看示例。
几个小时前,我需要将一些 C++ 类与 C# 接口。我查看了我的 Swig 目录(我已经将它用于其他工作),找到了目录Examples/csharp/class
,浏览了代码,加载了解决方案,摸索了它,复制了它,放入了我的代码,它起作用了,我的工作完成了。
话虽如此,生成的 P/Invoke 代码并不是满足所有需求的解决方案。根据您的项目,自己编写一些简单的 API 包装器或编写托管 C++ 可能同样简单(查找 SlimDX 以获得一个极好的示例)。
就我的需要而言,这很简单——我有mystuff.dll
,而且现在我还可以发货 mystuffnet.dll
。我同意该文档很难进入。
编辑:我注意到 OP 只提到了 C。为此,你并不真的需要 Swig,只需使用通常的 C#/C DLLImport interop syntax。当您希望从 C# 调用C++ 类时,Swig 会变得很有用。
几年前,我确实尝试使用 SWIG 来包装 C++ 项目,以便在 .NET 中使用。
我没有走得太远,因为生产 SWIG 所需的配置是一个巨大的痛苦。当时我只是想要一个解决方案,而不是学习另一种语言/api/等。这些天 SWIG 可能更容易使用,我不能告诉你。
我们最终使用托管 C++ 来包装 C++ 项目。它工作得非常好。
如果您只是直接从 dll 中调用函数,我建议不要担心上述任何一个,而只需使用P/Invoke