terminal/tools/GenerateAppxFromManifest.ps1

75 lines
2.8 KiB
PowerShell

# This script is used for taking all the activatable classes from a SxS manifest
# and adding them as Extensions to an Appxmanifest.xml.
# Params:
# - SxSManifest: The path to the SxS manifest to get the types from
# - AppxManifestPrototype: The path to an AppxManifest.xml-style XML document to add the Extensions to
# - SxSManifest: The path to write the updated XML doc to.
param (
[parameter(Mandatory=$true, Position=0)]
[string]$SxSManifest,
[parameter(Mandatory=$true, Position=1)]
[string]$AppxManifestPrototype,
[parameter(Mandatory=$true, Position=2)]
[string]$OutPath
)
# Load the xml files.
[xml]$manifestData = Get-Content $SxSManifest
[xml]$appxPrototypeData = Get-Content $AppxManifestPrototype
# You need to make sure each element we add is part of the same namespace as the
# Package, otherwise powershell will append a bunch of `xmlns=""` properties
# that will make the appx deployment reject the manifest.
$rootNS = $appxPrototypeData.Package.NamespaceURI
# Create an XML element for all the extensions we're adding.
$Extensions = $appxPrototypeData.CreateNode("element", "Extensions", $rootNS)
$assembly = $manifestData.assembly
$files = $assembly.file
$files | ForEach-Object {
$Extension = $appxPrototypeData.CreateNode("element", "Extension", $rootNS)
$Extension.SetAttribute("Category", "windows.activatableClass.inProcessServer")
$InProcessServer = $appxPrototypeData.CreateNode("element", "InProcessServer", $rootNS)
$Path = $appxPrototypeData.CreateNode("element", "Path", $rootNS)
# You need to stash the result here, otherwise a blank line will be echoed to
# the console.
$placeholder = $Path.InnerText = $_.name
$InProcessServer.AppendChild($Path)
$Extension.AppendChild($InProcessServer) | Out-Null
foreach($class in $_.activatableClass) {
$ActivatableClass = $appxPrototypeData.CreateNode("element", "ActivatableClass", $rootNS)
$ActivatableClass.SetAttribute("ActivatableClassId", $class.name)
$ActivatableClass.SetAttribute("ThreadingModel", $class.threadingModel)
$InProcessServer.AppendChild($ActivatableClass) | Out-Null
}
$Extensions.AppendChild($Extension) | Out-Null
}
# Add our fully constructed list of extensions to the original Appxmanifest prototype
$appxPrototypeData.Package.AppendChild($Extensions) | Out-Null
# Write the modified xml back out.
$appxPrototypeData.save($OutPath)
# Left as a helper for debugging:
# $StringWriter = New-Object System.IO.StringWriter;
# $XmlWriter = New-Object System.Xml.XmlTextWriter $StringWriter;
# $XmlWriter.Formatting = "indented";
# $appxPrototypeData.WriteTo($XmlWriter);
# $XmlWriter.Flush();
# $StringWriter.Flush();
# Write-Output $StringWriter.ToString();