You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# Xamarin UWP程序中运行外部EXE或批处理(BAT)文件

在Xamarin UWP中调用本地EXE或执行批处理文件的解决方案

我之前也碰到过UWP沙盒限制导致无法启动桌面程序的问题,普通的Launcher或Process类在UWP的沙盒环境下受限于权限,根本没法直接工作。官方支持的唯一合法途径是使用Full Trust Process Launcher(桌面桥技术),下面是具体的实现步骤和代码:

第一步:配置UWP项目的Package.appxmanifest

首先必须在项目的Package.appxmanifest里添加Full Trust扩展,声明允许启动桌面程序:

  1. 打开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>
  1. 同时确保添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:04:09