3

私は次の管理されていない構造を持っています。

struct MyNativeStruct_Foo
{   
 char product_name[4];
 char product_model[2];
}

そして管理された同等物

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MyManagedStruct_Foo
{
    [MarshalAs(UnmanagedType.LPStr, SizeConst = 4)]
    public string product_name;

    [MarshalAs(UnmanagedType.LPStr, SizeConst = 2)]
    public string product_model;
}

残念ながら、文字列は null で終了していません。商品名は4文字すべて使用。「LPStr」で管理構造を定義する場合、文字列は 0 で終了する必要があります。

管理構造を定義する別の方法はありますか? カスタム Marshaller 属性を定義することは可能ですか? それとも他のアイデアがありますか?

ノート; ネイティブ構造は変更できません。

ありがとう

アンバーグ

[編集] LPStr に変更 (ジェイソン・ラークのコメント)

4

1 に答える 1

4

マーシャリングを変更して、文字列をbytess の固定サイズの配列として扱い、Encodingクラスを使用してバイトをマネージド文字列に変換できます。

すなわち

[StructLayout(LayoutKind.Sequential)]
public struct MyManagedStruct_Foo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
    public byte[] product_name;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
    public byte[] product_model;

    public string GetProductName()
    {
        return System.Text.Encoding.ASCII.GetString(this.product_name);
    }

    public string GetProductModel()
    {
        return System.Text.Encoding.ASCII.GetString(this.product_model);
    }
}

世界で最もセクシーな構造体とは言えませんが、ニーズには合っているはずです。

于 2012-07-19T08:39:12.350 に答える