我有一个C ++库,我在其中编写了一些函数 此函数必须返回一个整数和一个字符串。 (2输出)我将从我的C#程序中调用此函数 这是我在C ++中的代码:
extern "C"{
__declspec(dllexport) UINT Read(OUT char* Temp )
{
.....
}
}
这是ImportDll
课程中的C#代码:
[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read(char[] temp);
以我的形式,我有这个:
char[] str = new char[256];
ImportDLL.Read(str);
它正确返回一个Int但字符串结果(str数组)完全为零(\ 0)!
我的代码有什么问题?
谢谢。
答案 0 :(得分:2)
Matthew Watson的答案之一:您还需要将stringbuilder参数封送到LPSTR(char *),例如
[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read([MarshalAs(UnmanagedType.LPStr)] StringBuilder temp);
答案 1 :(得分:1)
由于返回的值是OUT,我假设它是由C ++方法创建的。
在这种情况下,您可能需要将StringBuilder传递给它:
[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
public static extern uint Read(StringBuilder temp);
请注意,您还应该指定charset,这取决于C ++代码使用的字符编码 - ANSI或Unicode。
要调用它,请创建一个足够大的新StringBuilder并将其传递给Read()
,然后使用StringBuilder.ToString()在Read()
返回后检索字符串。
如果C ++函数需要一定大小的字符串缓冲区,则需要将StringBuilder创建为至少为该大小,例如:
const int BUFFER_SIZE = 128;
var sb = new StringBuilder(BUFFER_SIZE);
Read(sb);
var result = sb.ToString();
注意:如果不了解C ++函数的详细信息,很难说这是否真的是正确的解决方案。可能你需要传递一个字符串。