将无符号整数数组编组到VB.NET中
我尝试调用以下C函数:将无符号整数数组编组到VB.NET中,vb.net,pinvoke,marshalling,Vb.net,Pinvoke,Marshalling,我尝试调用以下C函数: void fann_get_layer_array(struct fann * ann, unsigned int * layers) 在这种情况下,我事先不知道层的长度,因此我使用以下PInvoke获取IntPtr: <DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_array@8")> Public Sub fann
void fann_get_layer_array(struct fann * ann, unsigned int * 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
但是,当我执行
封送.Copy
行时,我得到一个AccessViolationException。我最初认为这是因为C代码中的层是无符号的,但尝试恢复字节数组并不能解决这种情况。此后,我注意到pLayerArray的值低得令人怀疑,这让我认为可能是我的PInvoke语句导致了我的问题,但我不确定它可能有什么问题。感谢@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
使用指针指向数组的C程序不具有包含数组大小的参数(或使用空元素作为哨兵),这是非常罕见的。我还想看看你在用struct fann
做什么,以及你是如何计算\u NoLayers
?struct fann
是由库中的一个单独函数创建的。它随后被传递到库中几乎所有其他函数中。我在.NET中实现了一系列其他函数,它们都是我以同样的方式接受struct fann
,它们都能工作,所以我怀疑我的问题不是从那里来的。\n NoLayers
是由作用于struct fann*ann
的函数之一返回的。在我设计的测试场景中,我知道这是三,它返回三,所以这可能不是我问题的根源lem也是。您的VB代码匹配与本机代码不同的unsigned int**layers
。我认为您还没有完全理解本机接口。您需要首先这样做。从表面上看,本机代码要求调用方分配数组。或者它甚至可能不是数组。底线是您需要了解如何调用功能,但您尚未演示。
<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)