Silverlight 编程 之 如何绕过unsafe mode

    技术2022-05-20  40

     

    虽然同为C#语言,但Silverlight不支持unsafe mode下的编程,下面将针对具体问题介绍一些替代方法。

     

     

    我们经常会用到

    unsafe{//Marshal.Copy(frame.packet, 0, (IntPtr)(&pattern), sizeof(PatternModel));}

     

    由于不支持unsafe mode,所以我们可以通过如下方式解决:

     

    static void Main(string[] args)         {             double d = 3.14159d;             byte[] b = ToByteArray(d);             Console.WriteLine(b.Length);             Console.ReadLine();             double n = FrpmByteArray(b);             Console.WriteLine(n.ToString());             Console.ReadLine();         }         public static byte[] ToByteArray(object anything)         {             int structsize = Marshal.SizeOf(anything);             IntPtr buffer = Marshal.AllocHGlobal(structsize);             Marshal.StructureToPtr(anything, buffer, false);             byte[] streamdatas = new byte[structsize];             Marshal.Copy(buffer, streamdatas, 0, structsize);             Marshal.FreeHGlobal(buffer);             return streamdatas;         }         public static double FromByteArray(byte[] b)         {             GCHandle handle = GCHandle.Alloc(b, GCHandleType.Pinned);             double d = (double)Marshal.PtrToStructure(                 handle.AddrOfPinnedObject(),                 typeof(double));             handle.Free();             return d;         } 

     

    通常针对特殊的数据类型如structure / class data,常常编译会报错

    The structureType parameter layout is not sequential or explicit

    针对类定义可以仿照如下方式定义

     

    [StructLayout(LayoutKind.Sequential)] public class AnyName{ ... } 

    或者将类定义为struct

    public struct AnyName{ ... }

    此外针对特殊的类型如enum,可以仿照下面的方式处理

                // byte 2 structure            GCHandle handle = GCHandle.Alloc(frame.packet, GCHandleType.Pinned);            Type type = typeof (PatternModel);             pattern = (PatternModel)Marshal.PtrToStructure(                handle.AddrOfPinnedObject(),                Enum.GetUnderlyingType(typeof(PatternModel)));            handle.Free();  

     

     下面给大家推荐一些好的帖子供进一步学习:

    http://stackoverflow.com/questions/2079868/marshal-ptrtostructure-throwing-system-argumentexception-error

     

     


    最新回复(0)