1

VB.NET で使用したいラスター化されたグラフィックスを作成するために作成した C DLL があります。double **ibufferある時点で、関数のパラメーターとして倍精度へのポインターの配列を使用します。

では、これを Visual Basic から C DLL に渡すにはどうすればよいでしょうか。できれば、VB で配列を作成しますが、VB で値を操作したり使用したりする必要はありません。基本的に、VB が行う必要があるのは、ポインタの配列にメモリを割り当てることだけです。Cは他のすべてのことを行います。これはどのように達成できますか?

4

1 に答える 1

1

pInvokeを使用してVB.NETのCメソッドを呼び出していると仮定します

まず、ジャグ配列で使用できるデフォルトのマーシャリングはありません。つまり、少し複雑ですがそれほど難しくない独自のカスタムマーシャリングを実行する必要があります。これが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 に答える