UWP环境下进程内存读写遇PlatformNotSupportedException报错求解决方案
问题原因
UWP默认运行在应用容器沙箱中,微软对其做了严格的权限限制,System.Diagnostics.Process类的进程枚举、信息获取相关接口在UWP沙箱上下文内是被禁止调用的,因此会抛出PlatformNotSupportedException异常。
即便你绕过Process类拿到目标进程ID,默认UWP权限也不足以调用OpenProcess等API访问其他进程的内存空间,跨进程内存读写本身就不符合UWP的沙箱隔离设计。
可行解决方案
方案1:改用打包桌面应用(推荐)
该类跨进程内存读写的需求本身就不适合纯UWP项目开发,你可以将项目切换为Windows App SDK打包桌面应用,或是直接使用WPF/WinForms开发后通过MSIX打包分发。这类应用没有UWP的沙箱限制,你原有代码几乎不需要修改即可正常运行,
Process类和kernel32.dll的P/Invoke调用都可以正常执行。方案2:UWP加全信任桌面扩展
如果你必须保留UWP项目的外壳,可以通过添加桌面扩展组件实现功能:
- 打开UWP项目的
Package.appxmanifest代码视图,在Package根节点添加受限功能命名空间声明:
然后在xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp rescap"Capabilities节点下添加全信任权限声明:<rescap:Capability Name="runFullTrust" /> - 新建一个.NET 6+/NET Framework的控制台/Win32项目作为全信任扩展组件,将你内存读写的所有逻辑放到该项目中实现。
- UWP主程序通过进程间通信(比如AppService、标准输入输出)和扩展组件交互,需要读写内存时向扩展发送指令,由扩展执行操作后把结果返回给UWP展示。
- 打开UWP项目的
注意事项
- 不管使用哪种方案,程序都需要以管理员权限运行,否则调用
OpenProcess打开其他进程时会因为权限不足返回空句柄,操作失败。 - 你原有代码的P/Invoke声明存在兼容性问题,64位系统下进程句柄、内存地址都是64位,用
int类型会出现溢出错误,建议修改ReadProcessMemory的声明适配多架构:
调用时直接传入[DllImport("kernel32.dll")] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);IntPtr类型的句柄和地址即可,不需要强制转int。
内容的提问来源于stack exchange,提问作者Drew Rooks
相关产品推荐
相关产品推荐

