感谢@f6a4 的回答。我采取了相反的方式来实现我的目标。这是我的程序:
我找到一个answer https://stackoverflow.com/a/16189406/8928481找到后面的DLLGet-AppxPacage
Powershell 中的 cmdlet。用这个命令(Get-Command Get-AppxPackage).dll
,Powershell显示DLL文件路径如下:
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Windows.Appx.PackageManager.Commands\v4.0_10.0.0.0__31bf3856ad364e35\Microsoft.Windows.Appx.PackageManager.Commands.dll
转到文件资源管理器中的该路径并打开Microsoft.Windows.Appx.PackageManager.Commands.dll
任何 .NET 反编译器中的文件。这里我用的是dnSpy https://github.com/0xd4d/dnSpy.git. The Get-AppxManifest
命令部分有以下 C# 代码:
protected override void ProcessRecord()
{
AppxPackage appxPackage = this.packageManager.FindPackage(this.Package);
if (appxPackage != null)
{
string str;
if (appxPackage.IsBundle)
{
str = "\\AppxMetadata\\AppxBundleManifest.xml";
}
else
{
str = "\\AppxManifest.xml";
}
using (FileStream fileStream = new FileStream(appxPackage.InstallLocation + str, FileMode.Open, FileAccess.Read))
{
using (XmlReader xmlReader = XmlReader.Create(fileStream, new XmlReaderSettings
{
DtdProcessing = DtdProcessing.Ignore
}))
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(xmlReader);
base.WriteObject(xmlDocument);
}
}
}
}
我使用 Windows API 将该代码转换为类似的 C 代码。这是代码片段:
ExpandEnvironmentStringsW(L"%ProgramFiles%\\WindowsApps", Buffer, MAX_PATH);
swprintf(FirstFile, MAX_PATH, L"%ls\\*", Buffer);
hFile = FindFirstFileW(FirstFile, &fileInfo);
if (hFile != INVALID_HANDLE_VALUE) {
do {
if (wcsstr(fileInfo.cFileName, AppxName) != 0) {
memcpy(PackageName, fileInfo.cFileName, MAX_PATH);
}
} while (FindNextFileW(hFile, &fileInfo) != 0);
}