我有一个C ++ dll,它有一个返回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...
当我调查当地人时,它说变量'blah'等于“”。
数据发生了什么变化?
答案 0 :(得分:4)
您的C ++代码已损坏。您正在返回指向局部变量的指针。函数返回后不再存在。这往往在C ++程序中偶然起作用,但是强烈的未定义行为。它不可能在互操作场景下工作,pinvoke封送器使用堆栈将覆盖字符串。
可以起作用的声明:
void function (const char* str, char* output, size_t outputLength)
在输出参数的[DllImport]声明中使用StringBuilder,并传递一个具有足够容量的初始值。