我有一个 C DLL,用于创建我想在 VB.NET 中使用的光栅化图形。有一次,它使用一个指向 double 的指针数组double **ibuffer
作为函数的参数。
那么如何将它从 Visual Basic 传递给 C DLL?最好,我会在 VB 中创建数组,但我不需要在 VB 中操作或使用这些值。所以基本上,VB 需要做的就是为指针数组分配内存。C会做所有其他的事情。如何实现?
我假设您正在使用 pInvoke 在 VB.NET 中调用 C 方法
首先,Jagged 数组没有可用的默认编组,这意味着您必须自己进行自定义编组,这有点复杂但不是很困难。这是在 C# 中执行此类操作的代码。我对 VB.NET 语法不是很好,所以我相信你可以将它转换为 VB.NET
[DllImport( "yourdll.dll", EntryPoint="YourMethodName", CallingConvention=CallingConvention.Cdecl)]
static extern void YouMethodName(IntPtr matrix);
static void Main( string[] args )
{
double[][] test_matrix = { new double[] {1.1,2.2},
new double[] {3.3,4.4},
new double[] {5.5,6.6}};
IntPtr pa1 = marshalJaggedArray( test_matrix );
YourMethodName( pa1 );
}
static private IntPtr marshalJaggedArray( double[][] array )
{
int sizeofPtr = Marshal.SizeOf( typeof( IntPtr ) );
int sizeofDouble = Marshal.SizeOf( typeof( double ) );
IntPtr p1 = Marshal.AllocCoTaskMem( array.Length * sizeofPtr );
for ( int i = 0 ; i < array.Length ; i++ )
{
IntPtr v1 = Marshal.AllocCoTaskMem( array[i].Length * sizeofDouble );
Marshal.Copy( array[i], 0, v1, array[i].Length );
Marshal.WriteIntPtr( p1, i * sizeofPtr, v1 );
}
return p1;
}