.NET Framework WinForms如何无需PowerShell获取并启动AppX/UWP应用
在.NET Framework 4.7.2 WinForms中获取并启动UWP应用的正确方式
核心问题解答
UWP的PackageManager类属于Windows Runtime (WinRT) API,可以直接在.NET Framework 4.7.2的WinForms项目中调用,不需要依赖UWP类库。你之前引用UWP类库失败是因为方向错误——.NET Framework 4.7+本身内置了WinRT互操作支持,只需简单配置即可直接调用WinRT API。
具体实现步骤
1. 配置项目以支持WinRT
打开WinForms项目的.csproj文件,在<PropertyGroup>节点中添加以下配置(选择一个兼容的Windows SDK版本,如10.0.19041.0及以上):
<TargetPlatformVersion>10.0.19041.0</TargetPlatformVersion> <EnableWindowsRuntimeSupport>true</EnableWindowsRuntimeSupport>
也可以通过Visual Studio界面配置:右键项目→属性→应用程序→选择对应的“Windows SDK版本”(需提前安装该SDK)。
2. 用PackageManager获取UWP应用列表
直接引用WinRT命名空间,实例化PackageManager并筛选出可用的UWP应用:
using Windows.Management.Deployment; using Windows.ApplicationModel; using System.Linq; // 获取当前用户所有已安装的UWP包 var packageManager = new PackageManager(); var allPackages = packageManager.FindPackagesForUser(string.Empty); // 过滤出包含可执行入口的应用(排除系统服务包、资源包等) var usableUwpApps = allPackages .Where(p => p.Applications.Any()) .Select(p => new { DisplayName = p.DisplayName, PackageFamilyName = p.Id.FamilyName, // 取第一个应用入口(多数UWP仅一个入口) AppId = p.Applications.First().Id, InstallPath = p.InstalledLocation.Path }) .ToList();
3. 启动UWP应用
沿用你熟悉的方式,通过Shell:AppsFolder\{PackageFamilyName}!{AppId}格式启动,示例代码:
using System.Diagnostics; // 启动示例:选中第一个应用 var targetApp = usableUwpApps.First(); var launchUrl = $"Shell:AppsFolder\\{targetApp.PackageFamilyName}!{targetApp.AppId}"; Process.Start(new ProcessStartInfo(launchUrl) { UseShellExecute = true });
4. 获取UWP应用图标
通过Package对象的安装路径,读取应用清单中配置的图标文件:
using System.Drawing; using System.IO; // 从Package对象提取图标路径 var targetPackage = allPackages.First(p => p.Id.FamilyName == targetApp.PackageFamilyName); var appManifest = targetPackage.Applications.First(); var iconRelativePath = appManifest.VisualElements.Square44x44Logo.Path; var fullIconPath = Path.Combine(targetPackage.InstalledLocation.Path, iconRelativePath); // 加载图标 var appIcon = new Icon(fullIconPath);
替代方案:原生Windows API(P/Invoke)
如果不想依赖WinRT,也可以通过P/Invoke调用FindPackages、GetPackageInfo等Windows原生API,不过代码量会大幅增加,适合对兼容性要求极高的场景。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

