0

私は構造を持っています:

public struct MyStruct
{
   public int a;
   public int b;
   public byte[] mass;
}  

私が必要です:「質量」配列へのポインターをC++アンマネージ関数に渡します。そして、すべての作業が完了すると、「質量」へのポインターが返されます。

だから私はMyStructのリストを持っています。そして、リスト内の MyStruct に何が含まれているかを知る必要があります 返された「質量」(私が持っているポインター)。「質量」へのポインターがわかっている場合、ポインターを8バイトに減らして、MyStructへのポインターを取得できますか?

方法 :

1. IntPtr を「質量」配列に取得しますか?

2. IntPtr を MyStruct 構造体に取得しますか?

3.IntPtr から MyStruct を取得しますか?

ただし、Marshal.Copy などのコピー手順は使用しないでください...

または、必要なことを行うためのより良い方法はありますか? C++ や IntPtr のようなポインターを使用できますか?どうすればそれを行うことができますか?

4

2 に答える 2

1

配列のメモリがマネージ コードによって割り当てられていると仮定すると、次のようになります。

P/Invoke を介して配列をアンマネージ関数に渡す場合、配列が使用するメモリをコピーする必要がないように、配列は通常、マーシャラーによってメモリに固定されます。

IntPtr をまったく使用する必要はありません。配列パラメーターを受け入れるように P/Invoke を宣言するだけで済みます。

ただし、アンマネージ コードがマネージ コードに返されるメモリを割り当てている場合は状況が異なります。その後、物事ははるかに困難になります。

そうでないと仮定すると、「C」関数宣言を見せていただければ、P/Invoke 宣言を思いつくことができるかもしれません。

(私はあなたの状況がもう少し複雑かもしれないと感じています...)

あなたのためのいくつかの有用なリンク:

http://msdn.microsoft.com/en-us/library/z6cfh6e6%28v=vs.80%29.aspx

http://msdn.microsoft.com/en-us/library/zah6xy75.aspx

C#でp/invokeを使用してポインタを配列に渡すにはどうすればよいですか?

また、アンマネージ コードを呼び出して配列を渡すときにマーシャラーが行う最適化に関する下位レベルの情報。基本的に、可能であれば、データのコピーはまったく作成されません。

http://msdn.microsoft.com/en-us/library/23acw07k%28v=vs.80%29.aspx

于 2013-05-14T15:24:32.710 に答える
0

構造体には特定のメモリ アラインメントがある場合があるので注意してください。このリンクに興味があるかもしれません

于 2013-05-14T15:29:18.243 に答える