我正在尝试用swig将一些类从c ++包装到c#,它的工作非常好 突然,我试着打电话给某个方法,我的程序崩溃了 我的类流程看起来像这样(只有重要的类): c ++代码:
class B
{
public:
virtual void f1();
protected:
int f2();
};
class D:public B
{
public:
virtual void f1();
protected:
float f3();
};
这个类使swig为每个类生成一个SwigDirector
在我的c#代码中,我尝试做这样的事情:
public class Foo:D
{
void callF2Meth()
{
this.f2();
}
}
在d.f2()上抛出异常; 在swig生成调用f2的方法的代码看起来像这样(没有初始化):
arg1 = (Base *)jarg1; darg = dynamic_cast<SwigDirector_B *>(arg1); result = (int)(darg)->f2();
抛出异常是因为arg1是SwigDirector_D的类型,它不是从SwigDirector_B继承而是从D继承(也不是从SwigDirector_B继承而是从B继承)
swig代码:
%module(directors="1", allprotected="1") SwigExample
%{
#include "Base.h"
#include "Derived.h"
%}
%feature("director") Base;
%feature("director") Derived;
%include "Base.h"
%include "Derived.h"
所以我做了一些调试,我意识到swig试图将D的SwigDirector转换为B巫婆的SwigDirector,而不是在同一层次结构中。
如何告诉swig正确包装类?
答案 0 :(得分:0)
这似乎是SWIG中已知的限制/错误(请参阅SWIG-mailinglist上的问题)。我选择通过实现D :: f2(){return B :: f2();来解决这个问题。 }。