2011-12-07 77 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()。 –