将c字符串返回给C#程序

时间:2011-12-07 01:58:26

标签: c# c++ string dll export

我有一个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'等于“”。

数据发生了什么变化?

1 个答案:

答案 0 :(得分:4)

您的C ++代码已损坏。您正在返回指向局部变量的指针。函数返回后不再存在。这往往在C ++程序中偶然起作用,但是强烈的未定义行为。它不可能在互操作场景下工作,pinvoke封送器使用堆栈将覆盖字符串。

可以起作用的声明:

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

输出参数的[DllImport]声明中使用StringBuilder,并传递一个具有足够容量的初始值。