- PR -

[C#]VC++の共用体(配列有)をC#で書き直す方法

1
投稿者投稿内容
Prophet
会議室デビュー日: 2004/02/03
投稿数: 2
投稿日時: 2004-08-05 15:24
 こんにちわ。初めて投稿します。

 VC++にて実装した、固定長バイナリファイルアクセス部を
C#にて書き直そうと思っています。

 VC++のファイルアクセス用構造体(共用体の形をとっています)を
そのまま、C#にて書き直したところ、以下のようなエラーがでました

//---------------------

追加情報 : アセンブリ 'hogehoge, Version=1.0.1678.26377, Culture=neutral, PublicKeyToken=null'
からの型 'RecordItemTest' を読み込めませんでした。
オフセット 0 に不適切に整列されたか、オブジェクト以外のフィールドでオーバーラップされたオブジェクト フィールドが含まれています。

//---------------------

 構造体中のバイト配列のインスタンスが生成されてないのが原因だと思いますが、
C#での配列を含んだ共用体風の構造体の実装は、無理なんでしょうか?

 この件、情報をお持ちでしたら、ご教授のほう、よろしくお願いいたします。

    // VS.NET 2003
    // WindowsXP SP1

    //----------------------------------------
    /*
       //VC++ 構造体
       const int TESTRECORDLENGTH = 32;
       const int TESTRECORD_NAME = 12;

       //納品テーブル
       union RecordItemTest{
         char  dummy[TESTRECORDLENGTH];
         struct TAG_RECORDITEMTESTS {
           long  ID;              //主キー
           char  TestName[TESTRECORD_NAME];   //名前
           long  Nenrei;            //年齢
         } RecordItemTests;
       };
    */
    //----------------------------------------
    //C# 構造体
    public const int TESTRECORDLENGTH = 32;
    public const int TESTRECORD_NAME = 12;
    [StructLayout(LayoutKind.Explicit)]
      public struct RecordItemTest
    {
      [MarshalAs(UnmanagedType.ByValArray,SizeConst = TESTRECORDLENGTH)]
      [FieldOffset( 0)] public byte[]   dummy;

      [FieldOffset( 0)] public int    ID;         //主キー
      [MarshalAs(UnmanagedType.ByValArray,SizeConst = TESTRECORD_NAME)]
      [FieldOffset( 4)] public byte[]   TestName;     //名前
      [FieldOffset(16)] public int    Nenrei;      //年齢

    }
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-09 08:53
 unsafe?

 とりあえず、http://www.pinvoke.net/ ここに同じようなものがないか探す。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-09 14:04
[FieldOffset( 4)]
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=TESTRECORD_NAME )]
public String TestName;

以下を参照してください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconosinfosample.asp

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconmarshalingstrings.asp

_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
Prophet
会議室デビュー日: 2004/02/03
投稿数: 2
投稿日時: 2004-08-09 15:32
>>Jittaさん
>>えムナウさん
レス、ありがとうございます。

Jittaさんの紹介していただいたページに行って、一通り、みてみましたが、
参考になりそうな、サンプルは見あたりませんでした。
また、えムナウさんのコードサンプル、ご呈示、ありがとうございました。
ただ、ちょっと、微妙に違っている、雰囲気です。

.Net Frameworkでは、構造体中に配列を含む場合の共用体は、できないんじゃないかと、
結論に達しつつあります。

もともと、固定長のバイナリファイルを構造体にてアクセスするのが目的ですので、

1.固定サイズのbyte配列インスタンスを生成
2.ファイルにアクセス。1レコードをbyte配列にて取得
3.バイト配列を解析し、フィールドごとに切り分けて、フィールド格納クラスに値をセットする
4.(2.)に帰る

というロジックに変更して、実装してみたいと思います。
解析と格納のロジックにどれだけ、CPU時間とられるかわかりませんが、
レコード数も少ない(1000件程度)ですし、そう遅くはならないのでは?と踏んでいます。
1

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