- PR -

C#で共用体を実現する方法

1
投稿者投稿内容
のりてる
会議室デビュー日: 2006/06/10
投稿数: 9
投稿日時: 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();
}
==========================================================================
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-11-26 21:04
無理ですね。
代替案としては、
  • byte を必要な個数だけ並べた構造体を定義し、それを固定長配列の代用とする。インデクサを定義してやれば構造体である事をそんなに意識しなくても済むかも。
  • unsafe な構造体にして fixed キーワードで固定長配列として宣言する。ただしマネージドからは配列扱いできなくなるので、プロパティでマネージド配列に変換するなどした方がいいかもしれない。

と言った辺りですか。
のりてる
会議室デビュー日: 2006/06/10
投稿数: 9
投稿日時: 2006-11-27 22:47
Hongliangさん

早速のご返信ありがとうございます。
やりたかったことは、通信でバイト配列を取得し共用体に代入すれば、
そのまま値が取り出せる。というのを実現したかったのですが、
プログラムで配列を解析し、変数値に代入する方法をとりたいと思います。

ちなみに、
「byte を必要な個数だけ・・・」は、可読性・保守性がよろしくないこと、
「unsafe な構造体にして ・・・」は、.Netの流儀に従いたいこと、
で、上記のような方法を取るにいたりました。


1

スキルアップ/キャリアアップ(JOB@IT)