1

我用了

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 中使用它?

4

1 回答 1

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函数PtrToStructureHelper。但是,由于该PtrToStructure方法包含该属性,因此对这些win32函数的 Silverlight P/Invoke[SecurityCritical]调用很可能 会导致安全异常。

于 2012-08-03T07:07:01.177 回答