Tag: swig

使用SWIG,如何将C ++ void func(Class&out)包装为C#Class func()?

(不幸的是,SWIG的文档很难解析,在线示例似乎很少见。所以我来到这里。) 假设C ++函数对类类型使用这种典型的返回样式: void func(Class& out); 使用SWIG,这个函数应该用C#包装,如下所示: Class func(); 从我发现的,我可以使用类型图来实现这一目标。 假设Class实际上是int ,我根据我发现的例子尝试了以下内容: %include %{ void func(int& pOut); %} %apply int &OUTPUT { int &pOut } void func(int& pOut); 许多例子(尽管倾向于Python)表明这应该创建一个没有输出int参数的函数。 但是,我使用了以下命令行: swig.exe -namespace Test -o .\Test.cxx -c++ -module Test -csharp -outdir . test.i 这输出以下Test.cs: namespace Test { using System; using System.Runtime.InteropServices; public class Test { public […]

你能SWIG一个boost :: optional 吗?

我一直在成功使用SWIG构建一个包装器接口,以便在C#中使用我的C ++库。 最近我暴露了一些boost::optional对象,SWIG遇到了问题。 有没有一种标准的方法可以解决这个问题? 有人必须在此之前碰到这个……

如何SWIG std :: string&到C#ref string

我正在尝试将带有std::string引用的C ++函数转换为C#。 我的API看起来像这样: void GetStringDemo(std::string& str); 理想情况下,我希望从C#中看到类似的东西 void GetStringDemoWrap(ref string); 我知道我需要为此创建一个类型图,我尝试了一些使用std_string.i文件的东西,但我不认为我会在任何地方。 有没有人有任何例子。 我是Swig和C#的新手,所以我无法想出任何真实的想法。

如何在包装包含向量的模板类时让SWIG应用模板?

我试图使用SWIG来包装(在C#中)一些包含模板类的c ++代码,该模板类本身包含了一个std::vector 。 我已经在互联网上看到了关于如何为矢量类型声明模板的各种参考,但是无法使用额外的抽象层。 这就是我在interface.i文件中所做的事情,例如: // interface.i file %module myNamespaceWrapper %{ #include “myVector.h” %} %include “myVector.h” %include “std_string.i” %include “std_vector.i” namespace std { %template(vector_MyType) vector; %template(vector_Int) vector; } namespace myNamespace { %template(myVectorMyType) myVector; %template(myVectorInt) myVector; } 虽然这似乎可以自己正确地创建相应的C#类型,但是我试图定义的std :: vector模板不会应用于其他在内部使用它们的类,通过头文件包含它们。 为了告诉你我的意思,有一个c ++类,如: // myVector.h namespace myNamespace { template class myVector { private : std::vector vect; public […]

如何让SWIG处理C#中的utf8字符串?

我正在编写一个可移植的C ++库,它绑定到其他语言(java,C#,python)。 我正在SWIG的帮助下制作那些绑定。 我有一个用C ++编写的类: class MyClass { public: const char* get_value() const; // returns utf8-string void set_value(const char* value); // gets utf8-string private: // … }; 我在C#方面有类似的东西: public class MyClass { public string get_value(); public void set_value(string value); } SWIG做得很好,除了它在调用MyClass期间没有进行utf8 utf16字符串转换。 我该怎么办? 编写自定义类型映射看起来有点复杂,如果它是唯一可用的解决方案,我需要帮助。

将SWIG与以std :: string作为参数的方法一起使用

我使用SWIG来包装我的c ++类。 有些方法有一个const std::string&作为参数。 SWIG创建一个名为SWIGTYPE_p_std__string的类型,但是在c#中调用方法时,不能只传递一个普通的字符串。 以下示例仅是SWIG包附带的修改示例: public void setName(SWIGTYPE_p_std__string name) { examplePINVOKE.Shape_setName(swigCPtr, SWIGTYPE_p_std__string.getCPtr(name)); if (examplePINVOKE.SWIGPendingException.Pending) throw examplePINVOKE.SWIGPendingException.Retrieve(); } 在我的界面文件中我只有: /* File : example.i */ %module example %{ #include “example.h” %} /* Let’s just grab the original header file here */ %include “example.h” 并且用C ++包装的方法是: void Shape::setName(const std::string& name) { mName = name; } 我必须在接口文件中放入某种类型的地图吗? 如果是这样,我该怎么做?

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

在我之前的 三篇 文章之后 ,我现在可以将一个托管数组的struct传递给我的包装方法。 以下是文件摘录: // packer.i typedef struct { int width; // input int height; // input frame_t view; // output frame_t dest; // output } image_t; CSHARP_ARRAYS(image_t, image_t) %apply image_t INOUT[] { image_t *images } int pack(image_t *images, int nb_images, parameters_t params); 使用此签名生成一个函数: // packer_cs.cs public static int pack(image_t[] images, int nb_images, parameters_t […]

swig + mono:没有找到库的C#示例错误

我在Mac OS X 10.6.4上使用swig 2.0.1 + mono 2.6 / 2.8。 整体构建没问题,C#示例的构建也没问题。 问题是,当我运行示例(mono runme.exe)时,我总是得到以下错误。 未处理的exception:System.TypeInitializationException:类型初始化程序为examplePINVOKE抛出exception—> System.TypeInitializationException:SWIGExceptionHelper的类型初始化程序抛出exception—> System.DllNotFoundException:示例at(wrapper managed-to -native)examplePINVOKE / SWIGExceptionHelper:SWIGRegisterExceptionCallbacks_example(examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate,examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate,examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate,examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate,examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate,examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate,examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate ,examplePINVOKE / SWIGException上的examplePINVOKE / SWIGExceptionHelper / ExceptionDelegate,examplePINVOKE […]

将SWIG与C#一起使用时的最佳做法是什么?

有没有人在那里使用带有C#的SWIG库? 如果你有,你找到了什么陷阱以及使用该库的最佳方式是什么? 我正在考虑将它用作用C编写的程序的包装器,我想将头文件包装在我可以在我的.NET应用程序中使用它们。 编辑:对目标操作系统的一些澄清。 我计划在Linux和Windows上运行应用程序,因此我正在研究SWIG。 P / Invoke不是一个选项。

如何使用SWIG生成的接口在C#中正确转发?

我有一个非常庞大和成熟的C ++代码库,我正在尝试使用SWIG生成一个C#接口。 我无法改变实际的C ++代码本身,但我们可以使用SWIG提供的任何方式来扩展/更新它。 我面临的问题是,如下所示编写的C ++函数会导致C#出现问题。 A* SomeClass::next(A*) 调用者可能会执行以下操作: A* acurr = 0; while( (acurr = sc->next(acurr)) != 0 ){ if( acurr isoftype B ){ B* b = (B*)a; …do some stuff with b.. } elseif( acurr isoftype C ) … } 本质上,迭代一个元素容器,根据它们的真实类型,做一些不同的事情。 SWIG为“next”函数生成了C#层,遗憾的是执行了以下操作: return new A(); 因此,C#中的调用代码无法确定返回的对象是否实际上是派生类,它实际上似乎总是基类(这确实有意义)。 我遇到过几种解决方案: 使用%extend SWIG关键字在对象上添加方法,最终调用dynamic_cast。 正如我所看到的,这种方法的缺点是,这需要您了解inheritance层次结构。 在我的情况下它是相当巨大的,我认为这是一个维护问题。 使用%factory关键字提供方法和派生类型,并让SWIG自动生成dynamic_cast代码。 这似乎是第一个更好的解决方案,但是从更深层次的角度来看,它仍然需要您搜索所有方法以及它可能返回的所有可能的派生类型。 […]