将无符号整数数组编组到VB.NET中

时间:2015-12-12 23:37:14

标签: vb.net pinvoke marshalling

我想要调用以下C函数:

void fann_get_layer_array(struct fann * ann, unsigned int * layers)

在这种情况下,我事先并不知道layers的长度,所以我使用以下PInvoke来获取IntPtr:

<DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_array@8")>
Public Sub fann_get_layer_array(ByVal ann As IntPtr, ByRef layers As IntPtr)
End Sub

我正在尝试使用Marshal.Copy恢复数组:

Dim LayerArrayb(_NoLayers - 1) As Byte
Call fann_get_layer_array(pNN, pLayerArray)
Marshal.Copy(pLayerArray, LayerArrayb, 0, _NoLayers)

当我执行Marshal.Copy行时,我得到一个AccessViolationException。我最初认为这是因为C代码中的layers是无符号的 - 但尝试恢复字节数组并不能解决这种情况。我已经注意到pLayerArray接受了可疑的低值,让我觉得它可能是我的PInvoke声明导致我的问题,但我不确定它可能有什么问题。

1 个答案:

答案 0 :(得分:0)

感谢@David Hefferman通过指出本机代码正在等待预分配的数组(我在PInvoke中需要byval而不是byref来让我走上正轨以下对我有用......

我的PInvoke声明必须是以下形式:

<DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_array@8")>
Public Sub fann_get_layer_array(ByVal ann As IntPtr, byvallayers As IntPtr)
End Sub

以下工作可以恢复我的数组:

Dim pLayerArray As IntPtr
Dim LayerArray(_NoLayers - 1) As Integer
pLayerArray = Marshal.AllocHGlobal(NoLayers * 32)
Call fann_get_layer_array(pNN, pLayerArray)
Marshal.Copy(pLayerArray, LayerArray, 0, _NoLayers)