2011-12-07 3 views
2

私はCの文字列を返す関数を持つC++のdllを持っていますが、この関数を呼び出してC#の文字列に戻すC#プログラムがあります。ここでは、私がCの文字列をC#のプログラムに戻す

__declspec(dllexport) const char* function (const char* str) { 
     std::string stdString(str); 
     std::cout << stdString.c_str() << std::endl; // this prints fine, no data loss 
     return stdString.c_str(); 
} 

を意味するものだと、ここで私は地元の人たちに見てみると、それは変数「何とか」が「」に等しいと言うC#コード

[DllImport("MyDLL.dll")] 
    public static extern string function(string data); 

    string blah = function("blah"); 
    Console.WriteLine(blah); // doesn't print anything... 

です。

データには何が起こったのですか?

+2

'stdString'と一緒に破壊されました。 – lapk

+0

C#の 'string'は' const char * 'と等価ではありません。 –

+0

C#文字列に戻るにはどうすればよいですか? – tr0yspradling

答えて

4

C++コードが壊れています。ローカル変数へのポインタを返しています。関数が返った後も存在しなくなりました。これはC++プログラムでは偶然に作用する傾向がありますが、強いUndefined Behaviorです。 interopのシナリオではうまく動作しない可能性があります。ピンボケマーシャラーがスタックを使用すると、文字列が上書きされます。働くことができる

宣言:

void function (const char* str, char* output, size_t outputLength) 

出力引数[DLLIMPORT]宣言内のStringBuilderを使用して、十分な容量で初期化いずれかを通過します。

+0

'std :: string'の値を' char * 'の値に変換するにはどうしたらいいですか? – tr0yspradling

+0

あなたは元のスニペットで既に行いました。しかし、文字列を*出力*にコピーする必要があります。 strcpy_s()を使用してください。 –