我有一个用于创建光栅化图形的C DLL,我想在VB.NET中使用它。有一次,它使用一个指针数组将double **ibuffer
加倍作为函数的参数。
那么如何将它从Visual Basic传递给C DLL?我最好在VB中创建数组,但我不需要操作或使用VB中的值。基本上,所有VB需要做的是为指针数组分配内存。 C会做所有其他的事情。如何实现这一目标?
答案 0 :(得分:1)
我假设您正在使用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;
}