2011-12-07 78 views
2

我有一個C++ DLL具有返回一個C字符串的函數,我有一個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++程序中偶然發揮作用,但卻是強大的未定義行爲。它不可能在互操作場景中工作,pinvoke封送拆收器使用該堆棧將覆蓋該字符串。

的聲明可以工作:

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

使用StringBuilder在[的DllImport]聲明爲輸出參數,並傳遞一個初始化一個具有足夠容量。

+0

如何將我的'std :: string'值轉換爲'char *'值? – tr0yspradling

+0

你已經在你的原始片段做了。但是你必須*將*字符串複製到*輸出*。使用strcpy_s()。 –