4

デバイスにデータを送信するには、外部DLLを使用する必要があります。DLLで使用しているメソッドは、パラメーターとしてバイト配列へのポインターを取ります。C#を使用しているので、GCHandle.Allocメソッドを使用してメモリアドレスを取得し、それをIntPtrインスタンスに割り当てています。次に、IntPtrをパラメーターとして渡します。私が心配しているのは、これまでC#でポインターとメモリ割り当てを使用したことがないため、コードにメモリリークのリスクがある可能性があることです。コードは現在、次のように機能します。

GCHandle pinned = GCHandle.Alloc(byteArray, GCHAndleType.Pinned);
IntPtr arrayPtr = pinned.AddrOfPinnedObject();

var result = _externalDll.SendInfo(arrayPtr, byteArray.Length);   

pinned.Free();

これは、IntPtrを割り当てて使用する正しい方法ですか?動作しているように見えますが、これは実稼働マシンで毎日約100回同時に実行されるため、大きな問題は避けたいと思います。

4

1 に答える 1

3

一般に、 GCHandleを使用する必要があるのは、後で使用するためにアンマネージ コードがポインターへの参照を保持する場合のみです。

ここでは、ポインタを渡してすぐに解放しているように見えます。この場合、GCHandleをまったく使用しないでください。最初のパラメーターを byte[] にして、byteArray を直接渡すだけです。ランタイムは、呼び出し中に配列オブジェクトを固定し、配列の最初の要素へのポインターをアンマネージ コードに渡します。

于 2013-03-13T14:57:40.697 に答える