如何使用SWIG在C#中使用非常量引用类方法来包装方法?

时间:2015-06-30 14:01:57

标签: c# c++ swig

我使用SWIG为我不拥有的C ++库创建C#包装器。

我遇到问题的唯一功能如下:

int getStringWrapper(..., StringWrapperClass& parameter);

如果有帮助,StringWrapperClass不归我所有,但看起来与this question中提到的StringPtr类非常相似。链接的问题与std::string有关,但我认为我的问题更为笼统。

如何为一个对类类型进行非常量引用的方法编写SWIG类型映射(对于C#)?

SWIG正在产生:

SWIGEXPORT int SWIGSTDCALL CSharp_getStringWrapper(..., void * jarg3) {
  int jresult ;
  ...
  StringWrapperClass *arg3 = 0 ;
  int result;

  ...
  arg3 = (StringWrapperClass *)jarg3;
  if (!arg3) {
    SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "StringWrapperClass & type is null", 0);
    return 0;
  } 
  result = (int)getStringWrapper(...,*arg3);
  jresult = result; 
  return jresult;
}

但是我在调​​用getStringWrapper的行中遇到了受保护的内存访问错误。

我不擅长C ++ ......据我所知,SWIG正在使用指针StringWrapperClass*,但它需要一个引用,这是导致问题的原因?

我成功地包装了其他具有签名的方法:

int getStringWrapper(..., StringWrapperClass*& parameter);

在这种情况下,SWIG生成的代码与上面的类似,但是:

arg3 = (StringWrapperClass**)jarg3;

我看过this question,看起来非常像我想要实现的目标,除了我需要在C#中使用它。前面提到的linked question似乎也提供了一个解决方案。我已经尝试按照这些方式编写自己的C#类型图,因为我们之前没有知道如何替换C#的所有jenv,JCALL1内容。

还有this answer,但我真的不明白我现在的目标。

请允许对SWIG和C ++有更多了解的人比我指出正确的方向吗?

0 个答案:

没有答案