发现另一个包的版本号

Discover the version number of another package

我正在处理的 IoT Core 应用程序需要知道另一个应用程序的(包)版本。

是否可以找出另一个应用程序的版本(不需要管理员密码,如下例所示)?

遗憾的是 AppDiagnosticInfo 没有提供此信息(它提供了包 family 名称)。

我知道 Device Portal REST 可以做到这一点 api,但这需要设备管理员密码,这不适合生产场景。

//Import WindowsDevicePortalWrapper with NuGet
using Windows.System.Diagnostics.DevicePortal;
(...)
var devicePortalConnection1 = new DefaultDevicePortalConnection(
  "http://127.0.0.1:8080",
  "administrator",
  "my device administrator password"); 

var portal = new DevicePortal(devicePortalConnection1);
var packages = await portal.GetInstalledAppPackagesAsync();

您可以使用PackageManager 来获取安装包的版本。它不需要用户名和密码,但它 运行 在本地设备上。 请参考以下代码。

    Windows.Management.Deployment.PackageManager packageManager = new Windows.Management.Deployment.PackageManager();
    IEnumerable<Windows.ApplicationModel.Package> packages = (IEnumerable<Windows.ApplicationModel.Package>)packageManager.FindPackages();
    foreach(var pkg in packages)
    {
        var version = pkg.Id.Version;
        Debug.WriteLine(string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision));
    }

对于运行上面的代码,你还需要在Package.appxmanifest中添加一个restricted capability。必须在文件顶部添加新的命名空间:

xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"

并将以下内容添加到 Capabilties 标签中。

<rescap:Capability Name="packageQuery" />

您可能需要根据 this 信息将 'rescap' 命名空间添加到可忽略列表。