带输出参数的 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,因此任何大于该容量的字符串都会导致崩溃。
我有以下 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,因此任何大于该容量的字符串都会导致崩溃。