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;
}

不幸的是,stings 不是空终止的。使用了产品名称的全部 4 个字符。如果我用“LPStr”定义托管结构,则字符串必须以 0 结尾。

还有另一种定义托管结构的方法吗?可以定义自定义 Marshaller 属性吗?还是你有其他想法?

笔记; 本机结构无法更改。

谢谢

安贝格

[编辑] 更改为 LPStr(评论 Jason Larke)

4

1 回答 1

4

您可以更改编组以将字符串视为bytess 的固定大小数组,然后使用Encoding该类将字节转换为托管字符串。

IE

[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 回答