从 C# 调用 C++ dll 将返回垃圾字符

Calling C++ dll from C# returns junk characters

本文关键字:返回 字符 dll 调用 C++      更新时间:2023-10-16

我是C++新手。

我正在开发一个简单的dll。

我必须C++ C# 中的函数,其中包含文件位置信息,该信息应该是字符串。

C++向 C# 返回一些字符串。

这是我的代码..

extern "C" __declspec(dllexport) const char* ParseData(char *filePath)
{
    string _retValue(filePath);
    printf(_retValue.c_str());  //--> this prints ok
    return _retValue.c_str();
}



[DllImport("D:\Temp\chelper.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr ParseData(string s);

static void Main(string[] args)
{
    string s    = "D:\Temp\test.bin";
    string ret  = Marshal.PtrToStringAnsi(ParseData(s));
    Console.WriteLine(ret);
}

当我查看C++返回的字符串时,它如下所示。

硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼

我期待"D:\Temp\test.bin",我传递给C++dll。

我的代码有什么问题?

您的问题是您正在尝试返回局部变量。DLL 有权访问该内存,因为它声明了变量,但 C# 程序无法访问它,因此它正在获取垃圾。看看 Windows API 是如何做到的:让调用方向你传递一个缓冲区和该缓冲区的大小,并将你的结果存储在那里。像这样的东西(未经测试):

extern "C" __declspec(dllexport) void ParseData(char* filePath, int pathSize)
{
  char workingPath[pathSize + 1]; //leave space for a trailing null
  strncpy(workingPath, filePath, pathSize);
  //do whatever parsing you need to do here
  strncpy(filePath, workingPath, pathSize);
}

或者直接使用传递的filePath缓冲区。但是,无论您选择如何执行此操作,请确保将最终结果写入从调用方获得的缓冲区中,而不是局部变量中。