1

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

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

4

1 回答 1

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

于 2012-09-20T05:13:43.027 回答