我有以下非托管结构。
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)
答案 0 :(得分:4)
您可以更改编组以将字符串视为bytes
的固定大小数组,然后使用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);
}
}
不完全是世界上最性感的结构,但它应该可以满足您的需求。