我正在尝试以简单的方式自动运行appcert.exe。
我不能为我的生活弄清楚如何获得包的完整包名。例如,我有一个名为TwitterDemo
的应用程序,但是当我运行Get-AppxPackage时,该应用程序似乎甚至没有列出(可能列为类似c2934-289aa9-394...
的东西。而且,我真的很喜欢不依赖于使用来自powershell的Get-AppxPackage然后解析它的输出和/或将其移动到常规命令行。甚至似乎没有用于从.Net查询包数据库的API,并且C ++ API看起来相当复杂。
基本上,将应用程序“title”与其完整包名匹配的最简单方法是什么?
答案 0 :(得分:1)
有多种方法可以确定程序包的程序包全名。您是否有正在运行的进程,已安装的软件包或仅包含定义信息?
如果您有正在运行的流程,GetPackageFullName()是最佳方式。
如果你有一个已安装的软件包,Powershell对人类来说可能是最方便的。列出为当前用户安装的所有软件包: powershell -c $(Get-AppxPackage).PackageFullName 您可以通过PackageManager的FindPackages()方法以编程方式执行等效操作。
如果您只知道包裹的身份,可以通过PackageFullNameFromId()
计算其包裹全名答案 1 :(得分: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());
}
答案 2 :(得分:0)
我发现最简单的方法是使用Windows.Management.Deployment.PackageManager。这并没有完全解决问题,但我认为我的设计范围太广了。