微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight 编程 之 如何绕过unsafe mode

 

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

 

 

我们经常会用到

unsafe
{
//Marshal.copy(frame.packet,(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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐