Discussion:
Marshal について
(too old to reply)
C#Sharp.com
2005-09-07 08:56:03 UTC
Permalink
お世話になります。
Marshal クラスについてお聞きしたく投稿しました。

下記の3点ができるようですが、なぜ必要なのかわかりません。
結構ソースコードを見ていると使用されているので気になっています。

1.アンマネージ メモリの割り当て、
2.アンマネージ メモリ ブロックのコピー、
3.マネージ型からアンマネージ型への変換

以上、ご教示お願いします。
tamatama
2005-09-07 09:16:12 UTC
Permalink
Post by C#Sharp.com
Marshal クラスについてお聞きしたく投稿しました。
下記の3点ができるようですが、なぜ必要なのかわかりません。
結構ソースコードを見ていると使用されているので気になっています。
1.アンマネージ メモリの割り当て、
2.アンマネージ メモリ ブロックのコピー、
3.マネージ型からアンマネージ型への変換
Win32などのAPIやCOMのインターフェイスを直接呼ぶときに用います。
(COM DLLを作っているときは、呼ばれる側となり、そのときにも用います)
マネージからアンマネージに、また、逆もしかりで、直接メモリ(値、ポインタ)を交換させないようにすることで
マネージヒープを保護するためという解釈だと思いますが…
マネージヒープでは、ガベージコレクションが働くので、分離したいのではともいえます。

こんな説明でよいのでしょうか?
C#Sharp.com
2005-09-21 07:36:04 UTC
Permalink
いろいろ有り難うございます。
要するに下記の場合、Bufferを4byte マネージ領域に確保して、
更に、アンマネージメント領域に4byteの領域を確保して、Bufferの内容をコピーしている
ということでしょうか?
そうなると、Freeすべきかと思うのですが、いかがでしょうか?

ushort[] Buffer = new ushort[4];
IntPtr PtrBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0);
Post by tamatama
Win32などのAPIやCOMのインターフェイスを直接呼ぶときに用います。
(COM DLLを作っているときは、呼ばれる側となり、そのときにも用います)
マネージからアンマネージに、また、逆もしかりで、直接メモリ(値、ポインタ)を交換させないようにすることで
マネージヒープを保護するためという解釈だと思いますが…
マネージヒープでは、ガベージコレクションが働くので、分離したいのではともいえます。
tamatama
2005-09-21 09:28:10 UTC
Permalink
Post by C#Sharp.com
要するに下記の場合、Bufferを4byte マネージ領域に確保して、
更に、アンマネージメント領域に4byteの領域を確保して、Bufferの内容をコピーしている
ということでしょうか?
そうなると、Freeすべきかと思うのですが、いかがでしょうか?
ushort[] Buffer = new ushort[4];
IntPtr PtrBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0);
ushort[] Buffer = new ushort[4];
GCHandle gch = GCHandle.Alloc(Buffer);
IntPtr PtrBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0);
      :
      :
      :
gch.Free()


UnsafeAddrOfPinnedArrayElementのドキュメントを読んでいる限りでは、このような用法みたいです(あまり自身はないが…)

Remarkでは"The array must be pinned using a GCHandle before it is passed to
this method"となっているので
(「配列は、 GCHandle を使用して pin を実行してあります」という解説では?となってしまいますが)
「このメソッドに配列を渡す前にGCHandleを使って配列を固定する必要があります。」

GCHandle.Allocをすることによって、ガベージコレクションの対象にならないので、
アンマネージド領域を確保する必然性がなくなりようにも取れます。

おもわず、フォローが付かないかな…

Loading...