PInvoke的Win32函数为Marshal.PtrToStructure在Silverlight

2019-10-17 02:33发布

我用了

public static Object PtrToStructure(
IntPtr ptr,
Type structureType
)

在形式

private static object ReadStruct(byte[] buffer, Type t)
{
    GCHandle handle =
        GCHandle.Alloc(buffer,
        GCHandleType.Pinned);
    Object temp =
        Marshal.PtrToStructure(
        handle.AddrOfPinnedObject(),
        t);
    handle.Free();
    return temp;
}

在.NET 4.0数据编组。 Silverlight不支持这种方法。 根据下面的文章中,.NET方法简直就是一个天然的Win32函数的包装。 一个例子给出用于Marshal.AllocHGlobal(从Kernel32.dll中的Win32函数LocalAlloc)

http://blogs.msdn.com/b/silverlight_sdk/archive/2011/09/27/pinvoke-in-silverlight5-and-net-framework.aspx

这些都是新的水域,因为SL5刚启用PInvoke的受信任的应用程序(在浏览器为好)那是什么累得PtrToStructure包,是有什么在SL5使用该防止Win32函数?

Answer 1:

使用您所选择的反编译器,你将能够看到PtrToStructure(IntPtr, Type)确实在Silverlight 5的mscorlib.dll程序集来实现:

[SecurityCritical]
[ComVisible(true)]
[FriendAccessAllowed]
internal static object PtrToStructure(IntPtr ptr, Type structureType)

作为internal但它是其他组件无法访问。 PtrToStructure依次调用下面的方法:

[MethodImpl(MethodImplOptions.InternalCall)]
private static void PtrToStructureHelper(IntPtr ptr, object structure, bool allowValueClasses);

这是在公共语言运行库实现。

我一直无法识别通过调用Win32函数(S) PtrToStructureHelper 。 然而,由于PtrToStructure方法持有[SecurityCritical]属性这是极有可能的Silverlight 的P / Invoke调用这些Win32函数,如果确定,将导致安全性异常。



文章来源: pInvoke Win32 function for Marshal.PtrToStructure in Silverlight 5