MSIX多应用包:如何从入口应用获取并启动包内其他应用?
在MSIX包中从入口应用启动其他包含的应用
完全可以实现从MSIX包的入口应用启动包内的其他应用,核心思路是定位包内其他应用的可执行文件路径或其注册的应用标识,再通过系统API启动。以下是具体实现方式:
方法一:通过可执行文件路径启动
获取MSIX包的安装路径
使用Package.Current.InstalledLocation获取当前包的根目录,包内所有被包含的应用文件都会部署在此路径下的对应子目录中(具体结构取决于打包时的项目配置)。定位目标应用的可执行文件
根据打包时的项目结构,拼接目标应用exe的相对路径。例如,若你引用的第二个项目名为ToolApp,其打包后的exe可能位于ToolApp\ToolApp.exe(或对应框架版本的子目录),可通过以下代码定位:var packageRoot = Package.Current.InstalledLocation; var targetExe = await packageRoot.GetFileAsync(@"ToolApp\ToolApp.exe");启动目标应用
使用Launcher.LaunchFileAsync(符合Windows应用生态的推荐方式)启动:await Launcher.LaunchFileAsync(targetExe);若需要更灵活的进程控制,也可使用
Process.Start,但需确保入口应用声明了runFullTrust能力(在打包项目的应用清单中配置):var exeFullPath = Path.Combine(Package.Current.InstalledLocation.Path, @"ToolApp\ToolApp.exe"); Process.Start(new ProcessStartInfo(exeFullPath));
方法二:通过应用AUMID启动
如果包内的其他应用在打包时已注册了应用用户模型ID(AUMID),可以直接通过AUMID启动:
- 遍历包内应用获取AUMID
包内所有应用的信息可通过Package.Current.Applications获取,遍历找到目标应用的ID后,拼接为完整AUMID:var targetApp = Package.Current.Applications.FirstOrDefault(app => app.DisplayName == "我的辅助应用"); if (targetApp != null) { var aumid = $"{Package.Current.Id.FamilyName}!{targetApp.Id}"; // 启动应用 await Launcher.LaunchUriAsync(new Uri($"ms-appx:///{aumid}")); }
注意事项
- 确保打包时所有需要启动的应用都已被正确添加到打包项目的引用中,且其输出文件被包含在MSIX包内。
- 若使用
Process.Start,需在打包项目的Package.appxmanifest中添加runFullTrust能力声明。
内容的提问来源于stack exchange,提问作者Christophe Keller
相关产品推荐
相关产品推荐

