.NET 6 WPF中requestedExecutionLevel是否有效?何时生效?
问题解答
1. requestedExecutionLevel是否有效?
它是完全有效的,但它的作用和你测试的场景不匹配,所以你没观察到差异。
2. 它的生效场景是什么?
这个元素的核心作用是控制UAC文件/注册表虚拟化的开关,而非改变Environment.SpecialFolder.LocalApplicationData的路径:
- 当你保留该元素(哪怕是
level="asInvoker"),系统会禁用当前程序的UAC虚拟化机制; - 只有当你的程序尝试写入受保护的系统位置(比如
C:\Program Files下的目录、HKEY_LOCAL_MACHINE注册表项)时,它的效果才会显现:- 若注释该元素,无管理员权限的程序写入系统受保护位置时,系统会自动把数据重定向到用户的
VirtualStore目录(C:\Users\MyUser\AppData\Local\VirtualStore),程序不会报错; - 若保留该元素,无管理员权限的程序写入系统受保护位置时,会直接抛出权限不足的异常,不会进行重定向。
- 若注释该元素,无管理员权限的程序写入系统受保护位置时,系统会自动把数据重定向到用户的
3. 关于测试中的特殊情况
常规WPF项目
你测试时写入的LocalApplicationData是用户专属的可写目录,不属于系统受保护位置,不管是否开启虚拟化,都会直接写入真实路径C:\Users\MyUser\AppData\Local,所以两种情况下结果一致,这是正常现象。
Windows应用打包项目(MSIX)
这类项目的应用运行在沙箱隔离环境中,Environment.SpecialFolder.LocalApplicationData对应的实际路径是沙箱内部的专属目录(例如C:\Users\MyUser\AppData\Local\Packages\<你的包家族名>\LocalCache),而非系统的LocalApplicationData根目录。你在代码中创建的文件实际存在于沙箱内,直接去系统目录下当然找不到——这和requestedExecutionLevel无关,是MSIX沙箱的固有特性。
内容的提问来源于stack exchange,提问作者ispiro
相关产品推荐
相关产品推荐

