有没有人在那里使用带有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

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

1回复

如何使用SWIG从C代码生成的C#中的枚举?

这是我的C枚举: 这是我的C函数之一: 我期待在C#中获得类似的信息: 确实,函数包装器已生成,并且返回了称为myenum的内容,但是我看不到VALUE1等。 我如何使用C#包装器? 我想进行比较,赋值,将这些值传递给函数等,但是我看不到任何方法。 例如,我
1回复

来自现有C API的SWIG C#

我有一个纯C库,其标头是从Perl中的自定义IDL生成的。 我想转到SWIG(或其他生成器)以消除对Perl的依赖。 我还希望SWIG附带提供免费的Python和Ruby包装器。 我目前正在生成一个C#包装器,该包装器需要将父级的概念传递给构造函数: 以这种方式将SWIG与现有
1回复

获取C结构以记住SWIG的C#更改吗?

所以我试图在Linux(MonoDevelop)上的SWIG中使用C#中的C库。 一切都可以编译并正常运行,但是当我调用MsgBus_UseString时,控制台输出显示乱码,而不是“ HappyHappyJoyJoy”。 这是我在C#中的主要功能: 这是MsgBus_UseStr
1回复

从C#调用从C(swig接口)导出的函数

我有一个C语言的功能,定义如 在interface.i文件中我将函数定义为 我用生成的.cs文件生成了带有XCode Cocoa touch库和.dll文件的.a文件。 我试图从Xamarin iOS应用程序中的C#代码调用此callme函数。 但我不知道如何将值传递给此
1回复

SWIG:生成C#包装程序时未定义SWIGTYPE_p_void

为C(不是C ++)库生成包装器时,所生成的C#包装器代码缺少类型SWIGTYPE_p_void , SWIGTYPE_p_uint32_t等的定义。 等 在整个生成的代码中使用的代码。 我需要在我的.i文件中包含文件以使它们生成吗? 作为SWIG的命令行选项,我仅使用-csharp
2回复

SWIG:如何将指定的C#代码块添加到所有生成的C#方法

我正在使用SWIG生成到C API的C#绑定。 我希望在不经过特定类型映射的情况下,向所有生成的C#方法中添加固定代码块。 这可能吗? 更新: 一个例子是这样的: 这就是说我想生成与typemap或异常无关的代码,只需插入几行代码(例如,上面的“将在我所有方法中出现的
1回复

使用参数“char **”为C函数生成SWIG-Proxy

我尝试使用SWIG为这个C代码生成一个包装器: 第二个参数p1由SWIG生成为“SWIGTYPE_p_p_char”,它对C#无效。 如何告诉SWIG在这里生成“out string”或“ref string”参数? 我已经阅读了SWIG的文档,但只能理解它的一半。 对于SWIG-
1回复

使用SWIG将错误的值作为参数传递给C库

在前 三篇 文章之后 ,我现在可以将托管的struct数组传递给包装的方法。 以下是这些文件的摘录: 生成带有此签名的函数: 我这样称呼: 一切都很好,但是当我运行pack()方法时,我遇到了一个受保护的内存访问问题( System.AccessViolationExc
1回复

Swig - 生成包装器以传递struct数组

更新 我刚刚发现了%apply指令(例如见这里 )。 不幸的是我无法使用结构: 这导致: 我找不到任何有关此警告的文档。 看起来我必须定义一个自定义类型映射,但我不知道从哪里开始。 我对这种缺乏文档感到非常厌倦,并且非常渴望有一天能够成功编写我的包装器:( 原帖
3回复

我应该如何编写.i文件来包装Java或C#中的回调

我的C程序使用定期调用的回调函数。 我希望能够在Java或C#程序中处理回调函数。 我应该如何编写.i文件来实现这一目标? C回调看起来如此: