Silverlight 5中Marshal.ptrto结构的pInvoke Win32函数
我曾经 以Silverlight 5中Marshal.ptrto结构的pInvoke Win32函数,silverlight,winapi,pinvoke,silverlight-5.0,Silverlight,Winapi,Pinvoke,Silverlight 5.0,我曾经 以 public static Object PtrToStructure( IntPtr ptr, Type structureType ) 用于在.net 4.0中封送数据。Silverlight不支持此方法。根据下面的文章,.net方法只是本机win32函数的包装器。给出了Marshal.AllocHGlobal(来自Kernel32.dll的Win32 LocalAlloc函数)的示例 这些都是新的领域,因为SL5刚刚为受信任的应用程序启用了pInvoke(在浏览器中也是如此
public static Object PtrToStructure(
IntPtr ptr,
Type structureType
)
用于在.net 4.0中封送数据。Silverlight不支持此方法。根据下面的文章,.net方法只是本机win32函数的包装器。给出了Marshal.AllocHGlobal(来自Kernel32.dll的Win32 LocalAlloc函数)的示例
这些都是新的领域,因为SL5刚刚为受信任的应用程序启用了pInvoke(在浏览器中也是如此)。PtrToStructure包装的win32函数是什么?有什么东西阻止在SL5中使用它吗?使用您选择的反编译器,您将能够看到
PtrToStructure(IntPtr,Type)
确实是在Silverlight 5的mscorlib.dll程序集中实现的:
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;
}
属于内部
,但其他组件无法访问它PtrToStructure
依次调用以下方法:
[SecurityCritical]
[ComVisible(true)]
[FriendAccessAllowed]
internal static object PtrToStructure(IntPtr ptr, Type structureType)
它是在公共语言运行库中实现的
我无法识别
PtrToStructureHelper
调用的win32函数。但是,由于PtrToStructure
方法持有[SecurityCritical]
属性,因此对这些win32函数的Silverlight P/Invoke调用如果被识别,很可能会导致安全异常。使用您选择的反编译器,您将能够看到
PtrToStructure(IntPtr,Type)
确实是在Silverlight 5的mscorlib.dll程序集中实现的:
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;
}
属于内部
,但其他组件无法访问它PtrToStructure
依次调用以下方法:
[SecurityCritical]
[ComVisible(true)]
[FriendAccessAllowed]
internal static object PtrToStructure(IntPtr ptr, Type structureType)
它是在公共语言运行库中实现的
我无法识别
PtrToStructureHelper
调用的win32函数。但是,由于PtrToStructure
方法持有[SecurityCritical]
属性,因此很可能Silverlight P/Invoke调用了这些win32函数(如果已识别),将导致安全异常。很难想象普通Win32函数如何合成.net对象。很难想象普通Win32函数如何合成.net对象。感谢您的解释。最后,我使用BitConverter重新创建了这个结构,正如我最初用[StructLayout(LayoutKind.Sequential,Pack=1)]装饰它一样,谢谢您的解释。我最终使用BitConverter重新创建了该结构,正如我最初使用[StructLayout(LayoutKind.Sequential,Pack=1)]装饰它一样