我有以下本机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; (它必须与数组和指针有关,但我没有在互联网上找到关于数组的任何内容,如返回类型)?
答案 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
函数如何分配它。