pInvoke Silverlight 5中Marshal.PtrToStructure的Win32函数

时间:2012-08-03 02:58:40

标签: silverlight winapi pinvoke silverlight-5.0

我用过

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包含的win32函数是什么,有什么阻止在SL5中使用它的吗?

1 个答案:

答案 0 :(得分:1)

使用您选择的反编译器,您将能够看到在{em> mscorlib.dll Silverlight 5的程序集中确实实现了PtrToStructure(IntPtr, Type)

[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);

在公共语言运行库中实现。

我无法识别PtrToStructureHelper调用的 win32 函数。但是,由于PtrToStructure方法包含[SecurityCritical]属性,因此很可能Silverlight P / Invoke 调用这些 win32 函数,如果已识别,会导致安全例外。