質問

メソッドのパラメータの1つとしてint **を必要とするサードパーティDLLを使用しようとしています。メモリー割り当てを指すポインターのアドレスとしてパラメーターを記述します。

混乱をおかけして申し訳ありません。パラメータは双方向だと思います。 DLLはFPGAボードと通信するためのもので、メソッドはホストPCとPCIボード間のDMA転送をセットアップします。

役に立ちましたか?

解決

by-ref System.IntPtr

 [DllImport("thirdparty.dll")]
 static extern long ThirdPartyFunction(ref IntPtr arg);

 long f(int[] array)
  { long retval = 0;
    int  size   = Marshal.SizeOf(typeof(int));
    var  ptr    = IntPtr.Zero;

    try 
     { ptr = Marshal.AllocHGlobal(size * array.Length);

       for (int i= 0; i < array.Length; ++i) 
        { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size));
          Marshal.StructureToPtr(array, tmpPtr, false);
        }

       retval = ThirdPartyFunction(ref ptr);
     }
    finally 
     { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr);
     }

    return retval;
  }

他のヒント

この場合、マーシャルクラスを使用するか、安全でない状態にする必要があります。

また、単なる配列へのポインタである可能性があるため、 ref int []リストが機能する可能性があります。

int **はIntPtrの配列です。説明から、C ++ / CLIを使用して、たとえばアンマネージint **からマネージ配列への変換を支援したいと思うかもしれません^&gt; ^

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top