10

std::stringC#を参照してC++関数を変換しようとしています。

私のAPIは次のようになります。

void GetStringDemo(std::string& str);

理想的には、C#からこのようなものを見たいです

void GetStringDemoWrap(ref string);

このためのタイプマップを作成する必要があることを理解し、std_string.iファイルをいじっていくつかのことを試しましたが、どこにも到達していないと思います。誰かが例を持っていますか?私はSwigとC#の両方に慣れていないので、本物のアイデアを思いつくことはできません。

4

2 に答える 2

7

将来誰かがこれを探している場合に備えて、C# 用にこのような std_string.i を作成しました。私にはうまくいくようです。私の場合はより適切だったのでrefをoutに変更しましたが、refも同様に機能するはずです。

.i ファイルから %include "std_string.i" を呼び出しました

/* -----------------------------------------------------------------------------
 * std_string_ref.i
 *
 * Typemaps for std::string& and const std::string&
 * These are mapped to a C# String and are passed around by reference
 *
 * ----------------------------------------------------------------------------- */

%{
#include <string>
%}

namespace std {

%naturalvar string;

class string;

// string &

%typemap(ctype) std::string & "char**"
%typemap(imtype) std::string & "/*imtype*/ out string"
%typemap(cstype) std::string & "/*cstype*/ out string"

//C++
%typemap(in, canthrow=1) std::string &
%{  //typemap in
    std::string temp;
    $1 = &temp; 
 %}

//C++
%typemap(argout) std::string & 
%{ 
    //Typemap argout in c++ file.
    //This will convert c++ string to c# string
    *$input = SWIG_csharp_string_callback($1->c_str());
%}

%typemap(argout) const std::string & 
%{ 
    //argout typemap for const std::string&
%}

%typemap(csin) std::string & "out $csinput"

%typemap(throws, canthrow=1) string &
%{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str());
   return $null; %}

}

const std::string& の argout を定義する必要がある理由は、SWIG が混乱し、const std::string& も typemap でオーバーライドするためです。したがって、私の場合はオーバーライドしないように明示的に指示します(ユースケースが異なる場合があります)

Python の場合、次のようなものを作成しました。

%typemap(argout)std::string&
{
    //typemap argout std::string&
    PyObject* obj = PyUnicode_FromStringAndSize((*$1).c_str(),(*$1).length());

    $result=SWIG_Python_AppendOutput($result, obj);
}

%typemap(argout) const std::string & 
%{ 
    //argout typemap for const std::string&
%}
于 2012-12-19T18:01:27.403 に答える