.NET应用中如何移除Windows MSIX应用包?
解决方案:获取MSIX包的PackageFullName或实现移除功能
一、获取已安装MSIX包的PackageFullName
1. 通过包标识精准查询
如果你知道自研MSIX包的包名称和发布者信息(可从MSIX的AppxManifest.xml中Identity节点的Name、Publisher属性获取),可以直接用PackageManager.FindPackagesForUser方法定位:
using Windows.Management.Deployment; var packageManager = new PackageManager(); // 替换为你的包实际名称和发布者 string targetPackageName = "YourSelfDevelopedPackageName"; string targetPublisher = "CN=YourPublisherName"; // 查询当前用户下的匹配包 var matchedPackages = packageManager.FindPackagesForUser(string.Empty, targetPackageName, targetPublisher); foreach (var package in matchedPackages) { string packageFullName = package.Id.FullName; // 此处拿到的packageFullName即可用于RemovePackageAsync }
2. 通过MSIX文件解析标识后查询
如果手里保留着原MSIX安装文件,可以先解析包的标识信息,再匹配已安装包:
using Windows.Management.Deployment; var packageManager = new PackageManager(); string msixFilePath = @"D:\Path\To\Your\App.msix"; // 从MSIX文件生成包标识 var packageId = packageManager.CreatePackageId(msixFilePath); // 查询对应已安装包 var matchedPackages = packageManager.FindPackagesForUser(string.Empty, packageId.Name, packageId.Publisher); foreach (var package in matchedPackages) { string packageFullName = package.Id.FullName; }
3. 遍历已安装包筛选
如果不清楚包的具体标识,也可以遍历当前用户所有已安装包,通过包的特征(比如安装路径关键词、包名称关键词)筛选目标包:
using Windows.Management.Deployment; var packageManager = new PackageManager(); var allUserPackages = packageManager.FindPackagesForUser(string.Empty); foreach (var package in allUserPackages) { // 示例:通过安装路径包含自研包关键词筛选 if (package.InstalledLocation.Path.Contains("YourPackageKeyword")) { string packageFullName = package.Id.FullName; } }
二、能否直接通过MSIX文件移除包?
目前PackageManager没有提供直接通过MSIX文件路径移除包的API,必须传入packageFullName。不过可以结合上面的方法,先从MSIX文件解析出标识,再查询到对应packageFullName后执行移除:
using Windows.Management.Deployment; using System.Threading.Tasks; async Task RemovePackageViaMsixFile(string msixFilePath) { var packageManager = new PackageManager(); var packageId = packageManager.CreatePackageId(msixFilePath); var matchedPackages = packageManager.FindPackagesForUser(string.Empty, packageId.Name, packageId.Publisher); foreach (var package in matchedPackages) { await packageManager.RemovePackageAsync(package.Id.FullName); } }
注意事项
- 调用
PackageManager的部署相关方法,需要在应用的AppxManifest.xml中添加packageManagement权限:<Capabilities> <Capability Name="packageManagement" /> </Capabilities> - 桌面应用需引用
Windows.winmd,并将项目目标平台设置为Windows 10/11的对应版本。
内容的提问来源于stack exchange,提问作者Anh dang nhat
相关产品推荐
相关产品推荐

