C# 与 C DLL 互操作,如何编组从函数返回长度的 char 数组?
C# Interop with C DLL, how do I marshal a char array where length is returned from the function?
我必须从 C# 访问 C DLL。我没有 DLL 的源代码,所以我只能使用以下函数签名:
int func(unsigned char* instr, unsigned char* outstr, int inlength);
如何在 C# 中为此声明 DllImport,以便 .NET 理解返回的 INT 是 outstr 数组的长度。输出 char* 不是 C 风格的字符串。它们是字节数组,因此可以在输出中嵌入零。
[DllImport("the.dll")]
int func([In] string instr, [Out] ?????? outstr, int inlength);
编辑:请仔细阅读。 RETURN 值是 outstr 参数的长度。
你的 C API 不太理想。该函数不能分配新的缓冲区和 return 它,甚至不占用缓冲区的长度。
API 用户(您)必须事先知道函数将写入该数组的字节数上限,并提供该大小的输出缓冲区。
DLL 导入本身很简单:
[DllImport( "the.dll" )]
int func( [In, MarshalAs( UnmanagedType.LPArray, SizeParamIndex = 2 )] byte[] instr, [Out, MarshalAs( UnmanagedType.LPArray)] byte[] outstr, int inlength );
如果函数 returns 写入的字节数,调用函数然后调整输出数组的大小。
我必须从 C# 访问 C DLL。我没有 DLL 的源代码,所以我只能使用以下函数签名:
int func(unsigned char* instr, unsigned char* outstr, int inlength);
如何在 C# 中为此声明 DllImport,以便 .NET 理解返回的 INT 是 outstr 数组的长度。输出 char* 不是 C 风格的字符串。它们是字节数组,因此可以在输出中嵌入零。
[DllImport("the.dll")]
int func([In] string instr, [Out] ?????? outstr, int inlength);
编辑:请仔细阅读。 RETURN 值是 outstr 参数的长度。
你的 C API 不太理想。该函数不能分配新的缓冲区和 return 它,甚至不占用缓冲区的长度。
API 用户(您)必须事先知道函数将写入该数组的字节数上限,并提供该大小的输出缓冲区。
DLL 导入本身很简单:
[DllImport( "the.dll" )]
int func( [In, MarshalAs( UnmanagedType.LPArray, SizeParamIndex = 2 )] byte[] instr, [Out, MarshalAs( UnmanagedType.LPArray)] byte[] outstr, int inlength );
如果函数 returns 写入的字节数,调用函数然后调整输出数组的大小。