Marshaling Arrays作为返回值P / Inoke .NET

时间:2014-08-31 09:02:16

标签: arrays vb.net pinvoke

我有以下本机C函数声明,我想将其转换为VB.NET P / Invoke等效,以便调用它:

unsigned char *h5d65bv(const unsigned char *a, const int alen)

如您所见,它返回一个字节数组,并将另一个字节数组a及其长度(alen)作为参数。

我使用了以下签名,根据.NET错误("管理/非管理签名不匹配'返回值'。")不正确:

<DllImport("mydll.dll", EntryPoint:="h5d65bv", BestFitMapping:=False, CallingConvention:=CallingConvention.Cdecl, ThrowOnUnmappableChar:=True, CharSet:=CharSet.Ansi)> _
    Friend Function h5d65bv(ByVal a As Byte(), <MarshalAs(UnmanagedType.I4)> ByVal alen As Int32) As Byte()
    End Function

那么,哪一个是正确的&#34;签名&#34; (它必须与数组和指针有关,但我没有在互联网上找到关于数组的任何内容,如返回类型)?

1 个答案:

答案 0 :(得分:1)

实际上,返回类型只是指向unsigned char的指针。分配的字符数取决于函数的实现,.NET无法知道。

您可以做的是将.NET部件上的返回类型设为IntPtr,然后使用Marshall.Copy手动复制阵列。但是假设你知道知道数组的长度。

Dim ptr As IntPtr = h5d65bv(input, input.Length)
Dim output As New Byte(100)
Marshall.Copy(ptr, output, 0, 100)

另一点是您可能必须释放已分配的内存,但这又取决于h5d65bv函数如何分配它。