如何在C# Xamarin UWP程序中运行外部EXE或批处理(BAT)文件
在Xamarin UWP中调用本地EXE或执行批处理文件的解决方案
我之前也碰到过UWP沙盒限制导致无法启动桌面程序的问题,普通的Launcher或Process类在UWP的沙盒环境下受限于权限,根本没法直接工作。官方支持的唯一合法途径是使用Full Trust Process Launcher(桌面桥技术),下面是具体的实现步骤和代码:
第一步:配置UWP项目的Package.appxmanifest
首先必须在项目的Package.appxmanifest里添加Full Trust扩展,声明允许启动桌面程序:
- 打开
Package.appxmanifest,切换到XML视图,在<Package>标签内添加以下扩展代码:
<Extensions> <!-- 允许启动cmd.exe(用于执行BAT),如果是自定义EXE,把Executable改成你的EXE路径 --> <uap:Extension Category="windows.fullTrustProcess" Executable="cmd.exe" /> <!-- 示例:如果要启动项目内的自定义EXE --> <!-- <uap:Extension Category="windows.fullTrustProcess" Executable="Assets\EXE\whatever.exe" /> --> </Extensions>
- 同时确保添加Full Trust权限,在
<Capabilities>标签内加入:
<Capability Name="fullTrustProcessLauncher" />
第二步:启动本地EXE文件
对于系统自带程序(如Notepad、Calc)或自定义EXE,使用FullTrustProcessLauncher来启动:
using Windows.ApplicationModel; // 启动系统自带的Notepad(manifest里Executable设为cmd.exe也可以,或者直接设为notepad.exe) await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(); // 如果要启动自定义EXE并传递参数: // 假设你的EXE在项目Assets/EXE目录下,manifest里Executable设为"Assets\EXE\whatever.exe" string exeArgs = "-param1 value1 -param2 value2"; await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(exeArgs);
注意:自定义EXE要放在UWP项目的Assets文件夹中,右键文件→属性→设置“复制到输出目录”为始终复制,确保打包后路径正确。
第三步:执行批处理(BAT)文件
直接启动BAT会被沙盒阻止,所以通过cmd.exe来间接执行,利用Full Trust权限传递命令参数:
using Windows.ApplicationModel; using System.IO; // 示例1:执行本地绝对路径的BAT文件 string batAbsolutePath = @"C:\Tools\demo.bat"; // 使用/k参数可以让cmd窗口执行完后保持打开(方便看输出),/c则执行后关闭 string cmdArgs = $"/k \"{batAbsolutePath}\""; await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(cmdArgs); // 示例2:执行项目内的BAT文件(相对路径) string batRelativePath = @"Assets\EXE\demo.bat"; // 转换为绝对路径(UWP的安装目录可以通过Package.Current.InstalledLocation获取) string fullBatPath = Path.Combine(Package.Current.InstalledLocation.Path, batRelativePath); cmdArgs = $"/k \"{fullBatPath}\""; await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(cmdArgs);
为什么之前的方法失败?
- Launcher类:UWP的
Launcher仅支持打开关联的文件类型或合法URI,桌面程序和BAT不在沙盒允许的范围内,所以CanOpenAsync返回false,OpenAsync静默失败。 - 普通Process类:UWP沙盒禁止直接创建
Process对象,没有权限访问桌面程序,所以会报“拒绝访问”或“找不到文件”(而且Process不需要file:///前缀,直接用本地路径也没用,权限不够)。 - 直接调用cmd单条命令:之前的方式没有使用Full Trust权限,所以窗口一闪而过,且无法执行复杂的BAT脚本,因为参数传递和权限限制。
额外注意事项
- 发布时必须使用MSIX打包,因为Full Trust Process需要MSIX部署才能生效。
- 如果访问系统目录或外部文件,要确保当前用户有对应的读写权限。
- 不要使用
file:///前缀,直接使用本地路径字符串即可。
内容的提问来源于stack exchange,提问作者Snow
相关产品推荐
相关产品推荐

