構造体をメモリ(byte[])に吐き出す方法はあるか?

さて昨日はプラグインから戻ってきた3つの構造体をどうやって1つにくっつけるか?というところで止まっていた。これが難しい原因は大きく2つある。

●マネージドのメモリ管理の問題
まず最初の問題はC#の文法的な問題ではなく.Netのメモリ管理に関係する問題だ。.Netのメモリ管理下で動いている限りは構造体というものはコピー操作の対象に簡単にはできないのだ。C#は文法的にはC言語と同じく’&’をつけたらポインターが得られる事になっている。しかしこれをするとunsafeにしろ、とコンパイラーが怒ってくるのだ。unsafeとはつまりメモリ管理下から外れた処理にしろ、ということなのだ。今回はメモリ管理下でどうやってくっつけるか?を目標としたいのでこれは却下だ。

●ブロックコピー関数の問題
.Netは任意のメモリをブロックで扱うような関数があまり整っていない。上の説明のようにメモリ管理されている下で動くからという理由と、そもそもC#ポインターをなるべく意識しない作りであるのが大きな理由なんだと思う。一応メモリ管理下でもいくつか使えそうな手段も存在するが、

  1. System.IO.MemoryStreamのWrite()
  2. System.ArrayのCopyTo()
  3. System.BitConverterのGetBytes()やTo???()
  4. System.Runtime.InteropServices.MarshalのCopy()

どれにもいえることは、厳密に型が決まったものしか出力できないのだ。適当な構造体をメモリに出すにはもうちょっと工夫が必要なのだ。

というところで続きは後ほど。