【问题标题】:Programmatically matching a package name to a full package name以编程方式将包名称与完整的包名称匹配
【发布时间】:2012-10-22 15:27:09
【问题描述】:

我正在尝试以一种简单的方式自动运行 appcert.exe 的好方法。

我一生都无法弄清楚如何获取包的完整包名。例如,我有一个名为 TwitterDemo 的应用程序,但是当我运行 Get-AppxPackage 时,该应用程序甚至没有被列出(可能被列为类似 c2934-289aa9-394... 的东西。而且,我真的宁愿不依赖使用从 powershell 获取 AppxPackage,然后解析它的输出和/或将其移动到常规命令行。甚至似乎没有用于从 .Net 查询包数据库的 API,而且 C++ API 似乎相当复杂。

所以基本上,将应用程序“标题”与其完整包名称匹配的最简单方法是什么?

【问题讨论】:

  • 你为什么要这样做?可能有更好的方法来完成您想要完成的工作。
  • @mydogisbox 好吧,我真正需要做的是获取一个 appx 包,安装它,验证它,然后卸载它。但是,在安装 appx 之后,似乎没有办法获得完整的包名......似乎也没有官方 api(除了 powershell)可以用来安装和卸载应用程序
  • 啊,好的。这很有帮助。我不知道答案,但现在我知道我不知道答案。 ;-)
  • @Earlz 您可以确定未安装软件包的软件包全名。请参阅我的回答:PackageFullNameFromId()。此外,一个程序化 API——PackageManager 有方法来完成 Powershell cmdlet 所做的几乎所有事情(也许还有更多)。有关详细信息,请参阅下面的答案。

标签: .net windows-8 windows-runtime windows-store-apps


【解决方案1】:

有多种方法可以确定包的包全名。您是否有正在运行的进程、已安装的软件包或仅仅是定义信息?

如果你有一个正在运行的进程,GetPackageFullName() 是最好的方法。

如果你有一个安装包,Powershell 可能是最方便人类的。列出为当前用户安装的所有软件包: powershell -c $(Get-AppxPackage).PackageFullName 您可以通过PackageManagerFindPackages() 方法以编程方式执行等效操作。

如果你只知道一个包的身份,你可以通过PackageFullNameFromId() 计算它的包全名

【讨论】:

    【解决方案2】:

    我假设您正在编写一个外部应用程序来自动化 appcert。我还假设这是一个 win32 应用程序。如果是这种情况,您可以使用 win32 API GetPackageFullName 来获取一个 pacakge 的全名,给定一个进程句柄。因此,在下面的示例中,我向应用程序添加了一个列表框和按钮,然后具有以下代码:

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int GetPackageFullName(IntPtr hProcess, ref UInt32 packageFullNameLength, StringBuilder fullName);
    
    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = System.Diagnostics.Process.GetProcesses();
    
        listBox1.DisplayMember = "ProcessName";
    }
    
    
    private void button1_Click(object sender, EventArgs e)
    {
        var proc = listBox1.SelectedItem as System.Diagnostics.Process;
        uint len = 250;
        StringBuilder sb = new StringBuilder(len);
        var err =  GetPackageFullName(proc.Handle, ref len, sb);
    
        MessageBox.Show(sb.ToString());     
    }
    

    【讨论】:

      【解决方案3】:

      我发现最简单的方法是使用 Windows.Management.Deployment.PackageManager。这并不能完全解决问题,但我认为我的设计范围有点过于宽泛。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 2012-08-14
        • 2012-12-20
        • 2015-02-18
        相关资源
        最近更新 更多