我用过
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函数)给出了一个示例
这些是新的水域,因为SL5刚刚为可信赖的应用程序启用了pInvoke(在浏览器中也是如此)PtrToStructure包含的win32函数是什么,有什么阻止在SL5中使用它的吗?
答案 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 函数,如果已识别,会导致安全例外。