MarshalAs。。。。UnmanagedType【求助】
本帖最后由 shigaofei1 于 2013-01-20 07:13:51 编辑 问题是这样的
我声明的结构体如下:
public struct Repository
{
public Repository()
{
}
/// <summary>
/// 仓库名称
/// </summary>
[FieldOffset(0)]
[MarshalAs(UnmanagedType.选哪一个,后面n多参数该怎么填写。。。)]
public string Name{get;set;}
/// <summary>
/// 指针
/// </summary>
[FieldOffset(128)]
public ushort location{get;set;}
}
其实我的需求很简单,就是,当我把Repository结构体写入磁盘的时候。
Name占128字节。
但是Name可能只有12字节,但是我需要后面空出116字节,然后再写入下面的location的2个字节。
字符集使用unicode
但是
MarshalAs这个特性的参数里面UnmanagedType 这个枚举里面关于字符串的很多,难以看懂啊。。。虽然MSDN中有描述而且也是中文,但是,说实话,中文我也看不懂。。。感觉描述很不直观,难以理解。
因此,麻烦有哪位老大介绍一下要怎么实现。
[MarshalAs(这里面怎么填写,,理由是什么)]谢谢。
——————————————————————————————————————————————————————我换了一种方式,是这样的:
[StructLayout(LayoutKind.Explicit,Pack=1,CharSet=CharSet.Unicode,Size=64)]
public unsafe struct Repository
{
/// <summary>
/// 仓库名称
/// </summary>
[FieldOffset(0)]
public fixed char Name[32];
/// <summary>
/// 指针
/// </summary>
[FieldOffset(128)]
public ushort location;
}
但是在使用的时候又遇到问题了,丫的。。。
使用的时候如下:
Repository rpty=new Repository();
rpty.Name="table1".ToPointer();//这一句报错,报错内容为 赋值号左边必须是变量、属性或索引器
rpty.location=256;
难道固定大小缓冲区不算是成员变量吗?。。。太奇怪了哎。。。
到底要怎么搞啊。。。
这里为什么不使用.net 的Mashal 的封装原因是,使用Mashal即需要分配托管内存,又需要分配非托管内存。。。
这样就要分配两次内存,对性能不好。。。
而且,内存也很浪费。
还是请教,上面的那个问题:
rpty.Name="table1".ToPointer();//这一句报错,报错内容为 赋值号左边必须是变量、属性或索引器
要怎么解决?
[解决办法]
结构体=》指针可以试试这个方法 Marshal.StructureToPtr