我想要调用以下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声明导致我的问题,但我不确定它可能有什么问题。
答案 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)