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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:48:23