【发布时间】:2016-06-30 07:54:25
【问题描述】:
我有以下 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);
如果我运行它,程序会严重崩溃(这意味着毫无例外地崩溃。只是关闭,就是这样)。我做错了什么?
【问题讨论】:
-
Matthew 的回答似乎是正确的。但是对于您的下一个问题:请至少告诉我们错误消息。 “Crashs terribly”不如异常消息好。
-
也不例外,就是问题所在。程序退出,就是这样......
-
这个函数的接口坏掉了。您无法防止缓冲区溢出。您必须让调用者传递缓冲区的长度,然后确保您不会复制超出缓冲区的末尾。
标签: c# c++ pinvoke marshalling