有人在 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 还生成了一堆 C# 文件,我将它们编译成 .NET DLL。我的其他包装器(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互操作语法。当您想要从 C# 调用 C++ 类 时,Swig 会变得很有用。
几年前我确实尝试使用 SWIG 来包装一个 C++ 项目以便在 .NET 中使用。
我没有走得太远,因为生成 SWIG 所需的配置是一个巨大的痛苦。当时我只是想要一个解决方案,而不是学习另一种语言/api/等等。 SWIG 现在可能更容易使用,我无法告诉你。
我们最终使用托管 C++ 来包装 C++ 项目。效果真的很好。
如果您只是直接从 dll 中调用函数,我建议不要担心上述任何一个,而只需使用 P/Invoke