2012-10-23 39 views
8

Tôi đang cố chuyển đổi hàm C++ với tham chiếu std::string thành C#.Cách SWIG std :: string & to C# ref string

API của tôi trông như thế này:

void GetStringDemo(std::string& str); 

Lý tưởng nhất là tôi muốn nhìn thấy một cái gì đó như thế này từ C#

void GetStringDemoWrap(ref string); 

Tôi hiểu rằng tôi cần phải tạo ra một typemap cho điều này, và tôi đã cố gắng một vài thứ bằng cách chơi xung quanh với tệp std_string.i, nhưng tôi không nghĩ mình đang đi đâu cả. Có ai có ví dụ nào không. Tôi mới tham gia cả Swig và C# nên tôi không thể đưa ra bất kỳ ý tưởng chính hãng nào.

Trả lời

5

Chỉ trong trường hợp ai đó đang tìm kiếm điều này trong tương lai, tôi đã tạo std_string.i như thế này cho C#. Dường như làm việc cho tôi. Lưu ý rằng tôi đã thay đổi ref ra vì nó phù hợp hơn trong trường hợp của tôi nhưng ref cũng hoạt động tốt.

tôi gọi% bao gồm "std_string.i" từ tập tin .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; %} 

} 

Lý do tôi cần phải xác định argout cho std :: string const & là vì SWIG sẽ bị lẫn lộn và ghi đè std const: : string & cũng với typemap. Vì vậy, tôi dứt khoát nói với nó không ghi đè lên trong trường hợp của tôi (Bạn có thể có một trường hợp sử dụng khác nhau)

Đối với Python Tôi tạo ra một cái gì đó như thế này:

%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& 
%}