C#与C DLL互操作,如何封送从函数返回长度的char数组?

问题描述 投票:0回答:1

我必须从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# dllimport
1个回答
-1
投票

您的C API不够理想。该函数无法分配新缓冲区并返回它,甚至不占用缓冲区的长度。

API用户(您)必须事先知道函数将写入该数组多少字节的上限,并提供该大小的输出缓冲区。

DLL导入本身很简单:

[DllImport( "the.dll" )]
int func( [In, MarshalAs( UnmanagedType.LPArray, SizeParamIndex = 2 )] byte[] instr, [Out, MarshalAs( UnmanagedType.LPArray)] byte[] outstr, int inlength );

如果函数返回写入的字节数,请调用函数,然后调整输出数组的大小。

© www.soinside.com 2019 - 2024. All rights reserved.