【问题标题】:returning c string to a C# program将 c 字符串返回到 C# 程序
【发布时间】:2012-01-14 14:54:13
【问题描述】:

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

数据发生了什么变化?

【问题讨论】:

  • stdString一起被销毁了。
  • C# 的string 不等于const char*
  • 我将使用什么来返回 C# 字符串?

标签: c# c++ string dll export


【解决方案1】:

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

一个可行的声明:

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

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

【讨论】:

  • 如何将我的std::string 值转换为char* 值?
  • 你已经在你原来的 sn-p 中做了。但是您必须将字符串复制输出。使用 strcpy_s()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2020-12-12
相关资源
最近更新 更多