我有以下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);
如果我运行它,程序崩溃非常严重(意味着崩溃,没有例外。只是关闭,就是这样)。我做错了什么?
答案 0 :(得分:2)
这里的问题是:你的代码如何知道字符串缓冲区应该有多大?
通常你会找到一些方法。在没有这些信息的情况下,您唯一能做的就是在调用函数之前将StringBuilder
初始化为与您期望的最大字符串一样大。
例如:
StringBuilder error = new StringBuilder(1024); // Assumes 1024 chars max.
您的代码正在传递StringBuilder
,其默认容量为(我认为)16,因此任何大于此值的字符串都会导致崩溃。