指针数组在Visual Basic中加倍

时间:2012-09-20 04:57:48

标签: c arrays vb.net pointers dll

我有一个用于创建光栅化图形的C DLL,我想在VB.NET中使用它。有一次,它使用一个指针数组将double **ibuffer加倍作为函数的参数。

那么如何将它从Visual Basic传递给C DLL?我最好在VB中创建数组,但我不需要操作或使用VB中的值。基本上,所有VB需要做的是为指针数组分配内存。 C会做所有其他的事情。如何实现这一目标?

1 个答案:

答案 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;
  }

取自:http://social.msdn.microsoft.com/Forums/is/csharplanguage/thread/dd729947-f634-44f4-8d91-11fcef97cabe