具有输出参数的PInvoking函数

时间:2016-06-30 07:54:26

标签: c# c++ pinvoke marshalling

我有以下C ++函数:

until:2015-12-21

我在C#中像这样进行PInvoking:

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);

如果我运行它,程序崩溃非常严重(意味着崩溃,没有例外。只是关闭,就是这样)。我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

通常你会找到一些方法。在没有这些信息的情况下,您唯一能做的就是在调用函数之前将StringBuilder初始化为与您期望的最大字符串一样大。

例如:

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

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