1

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

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

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

4

3 回答 3

1

There are multiple ways to determine the Package Full Name for a package. Do you have a running process, an installed package or merely definitional information?

If you have a running process, GetPackageFullName() is the best way.

If you have an installed package, Powershell is probably the most convenient for human. To list all packages installed for the current user: powershell -c $(Get-AppxPackage).PackageFullName You can do the equivalent programmatically via PackageManager's FindPackages() method.

If you just know a package's identity you can calculate its Package Full Name via PackageFullNameFromId()

于 2012-10-24T06:06:12.267 回答
0

我假设您正在编写一个外部应用程序来自动化 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());     
}
于 2012-10-22T17:53:15.377 回答
0

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

于 2012-10-23T14:43:47.253 回答