带输出参数的 PInvoking 函数

PInvoking function with output parameter

我有以下 C++ 函数:

int my_func(char* error) {
  // Have access here to an Exception object called `ex`
  strcpy(error, ex.what());
  return 0;
}

我在 C# 中像这样调用它:

[DllImport("pHash.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int my_func(
    [MarshalAs(UnmanagedType.LPStr)]
    StringBuilder error);

并在代码中这样使用(当然总是 C#):

StringBuilder error = new StringBuilder();
int returnValue = my_func(error);

如果我 运行 这个,程序会崩溃得很厉害(意思是毫无例外地崩溃。只是关闭,就是这样)。我做错了什么?

这里的问题是:您的代码如何知道字符串缓冲区应该有多大?

通常您会通过某种方式找到答案。在没有此信息的情况下,您唯一可以做的就是在调用函数之前将 StringBuilder 初始化为与您期望的最大字符串一样大。

例如:

     StringBuilder error = new StringBuilder(1024); // Assumes 1024 chars max.

您的代码正在传递具有默认容量的 StringBuilder,即(我认为)16,因此任何大于该容量的字符串都会导致崩溃。