- - PR -
C#で共用体を実現する方法
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-11-26 20:25
以下のソースのようにTestStruct構造体のように宣言して、共用体として
使用したいのですが、このソースではコンパイルは通るのですが 実行すると、以下のような例外が発生します。 ------------------------------------------------------------ System.TypeLoadException はハンドルされませんでした。 Message="アセンブリ 'Test, Version=1.0.0.0, Culture= neutral, PublicKeyToken=null' からの 型 'TestStruct' を 読み込めませんでした。オフセット 0 に不適切に整列されたか、 オブジェクト以外のフィールドでオーバーラップされた オブジェクト フィールドが含まれています。" ------------------------------------------------------------ 構造体中に配列を含む場合の共用体を宣言して使用する方法は ありますでしょうか? 参考として、過去ログ「件名:[C#]VC++の共用体(配列有)をC#で書き直す方法」も 参照しております。 ========================================================================== /// 環境:VS2005 C#2.0 /// 構造体宣言 [StructLayout(LayoutKind.Explicit)] struct TestStruct { [FieldOffset(0)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] private byte[] bytes_; [FieldOffset(0)] private int id1_; [FieldOffset(4)] private int id2_; } /// Main関数 static void Main(string[] args) { TestStruct t = new TestStruct(); } ========================================================================== |
|
投稿日時: 2006-11-26 21:04
無理ですね。
代替案としては、
と言った辺りですか。 |
|
投稿日時: 2006-11-27 22:47
Hongliangさん
早速のご返信ありがとうございます。 やりたかったことは、通信でバイト配列を取得し共用体に代入すれば、 そのまま値が取り出せる。というのを実現したかったのですが、 プログラムで配列を解析し、変数値に代入する方法をとりたいと思います。 ちなみに、 「byte を必要な個数だけ・・・」は、可読性・保守性がよろしくないこと、 「unsafe な構造体にして ・・・」は、.Netの流儀に従いたいこと、 で、上記のような方法を取るにいたりました。 |
1