首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

MarshalAs。UnmanagedType

2013-01-25 
MarshalAs。。。。UnmanagedType【求助】本帖最后由 shigaofei1 于 2013-01-20 07:13:51 编辑问题是这样的我声明

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

热点排行