有没有人在那里使用带有C#的SWIG库? 如果你有,你找到了什么陷阱以及使用该库的最佳方式是什么? 我正在考虑将它用作用C编写的程序的包装器,我想将头文件包装在我可以在我的.NET应用程序中使用它们。

编辑:对目标操作系统的一些澄清。

我计划在Linux和Windows上运行应用程序,因此我正在研究SWIG。 P / Invoke不是一个选项。

===============>>#1 票数:14

对于我的上一个项目,这是整个C#SWIG配置文件:

%module mdProject

%{
#include "mdProject.h"
%}

我在SWIG编译它:

swig -csharp -c++ -I../../Include mdProject.i

这生成了一个Project.cxx,我编译并直接链接到'main'DLL,所以我不需要第二个C ++'helper'DLL。 SWIG还生成了一堆C#文件,我将其编译成.NET DLL。 我的其他包装器(Java,PHP等)确实使用了辅助DLL。

正如@patrick所提到的,SWIG使用P / Invoke,所以如果你遇到问题,你需要找到另一个解决方案。

如果你使用偏离普通类型(空洞,结构等)的类型,你将不得不做一些额外的工作来使它正确,但对于使用int,char *等的普通API,它没关系。

===============>>#2 票数:9 已采纳

我认为早期海报所犯的错误是阅读文档而不是看例子。

几个小时前,我需要将一些C ++类与C#接口。 我查看了我的Swig目录(我已将其用于其他工作),找到目录Examples/csharp/class ,浏览代码,加载解决方案,grokked它,复制它,放入我的代码,它工作,我的工作是完成。

话虽如此,生成的P / Invoke代码并不是满足所有需求的解决方案。 根据您的项目,自己编写一些简单的API包装器或编写托管C ++可能同样简单(查找SlimDX以获得极好的示例)。

根据我的需要,它简单易行 - 我有mystuff.dll ,现在另外我可以发送mystuffnet.dll 我同意该文档很难进入。

编辑:我注意到OP只提到了C.为此,你真的不需要Swig,只需使用通常的C#/ C DLLImport互操作语法 当您想要从C#调用C ++类时,Swig会很有用。

===============>>#3 票数:5

几年前,我确实尝试使用SWIG包装项目C ++,以便在.NET中使用。

我没有走得太远,因为产生SWIG所需的配置是一个巨大的巨大痛苦。 当时我只想要一个解决方案,而不是学习另一种语言/ api /等。 这些天SWIG可能更容易使用,我无法告诉你。

我们最终使用托管C ++来包装C ++项目。 它运作得很好。

如果您只是直接从dll调用函数,我建议不要担心上述任何一个,只是使用P / Invoke

  ask by Dale Ragan translate from so

未解决问题?本站智能推荐: