-
-
Save mattifestation/7ba8fc8f724600a9f525714c9cf767fd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function New-CompilerInputXml { | |
<# | |
.SYNOPSIS | |
Creates a an XML file consisting of a serialized CompilerInput object. | |
.DESCRIPTION | |
New-CompilerInputXml creates an XML file consisting of compiler options. This file is required as the first argument for Microsoft.Workflow.Compiler.exe. | |
.PARAMETER XOMLPath | |
Specifies the path to the target XOML file. This can be a relative or absolute path. This path will be included in the resulting XML file that New-CompilerInputXml outputs. | |
.PARAMETER OutputPath | |
Specifies the path to which New-CompilerInputXml will save the serialized CompilerInput object. | |
.EXAMPLE | |
New-CompilerInputXml -XOMLPath C:\Test\foo.xoml -OutputPath test.xml | |
Outputs a serialized CompilerInput object to test.xml and specifies a full path to a XOML assembly reference. | |
.EXAMPLE | |
New-CompilerInputXml -XOMLPath foo.xoml -OutputPath test.txt | |
Outputs a serialized CompilerInput object to test.txt and specifies a XOML assembly reference using a relative path. Note that Microsoft.Workflow.Compiler.exe doesn't care about the extension supplied in the first argument. | |
.OUTPUTS | |
System.IO.FileInfo | |
Outputs a FileInfo object to serve as confirmation that the resulting serialized XML wil was created. | |
#> | |
[OutputType([System.IO.FileInfo])] | |
param ( | |
[String] | |
[ValidateNotNullOrEmpty()] | |
$XOMLPath = 'test.xoml', | |
[Parameter(Mandatory = $True)] | |
[String] | |
[ValidateNotNullOrEmpty()] | |
$OutputPath | |
) | |
# This assembly won't be loaded by default. We need to load | |
# it in order to get access to the WorkflowCompilerParameters class. | |
Add-Type -AssemblyName 'System.Workflow.ComponentModel' | |
# This class contains the properties we need to specify for Microsoft.Workflow.Compiler.exe | |
$WFCompilerParams = New-Object -TypeName Workflow.ComponentModel.Compiler.WorkflowCompilerParameters | |
# Necessary to get Microsoft.Workflow.Compiler.exe to call Assembly.Load(byte[]) | |
$WFCompilerParams.GenerateInMemory = $True | |
# Full path to Microsoft.Workflow.Compiler.exe that we will load and access a non-public method from | |
$WorkflowCompilerPath = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory() + 'Microsoft.Workflow.Compiler.exe' | |
# Load the assembly | |
$WFCAssembly = [Reflection.Assembly]::LoadFrom($WorkflowCompilerPath) | |
# This is the helper method that will serialize the CompilerInput object to disk | |
$SerializeInputToWrapper = [Microsoft.Workflow.Compiler.CompilerWrapper].GetMethod('SerializeInputToWrapper', [Reflection.BindingFlags] 'NonPublic, Static') | |
$TempFile = $SerializeInputToWrapper.Invoke($null, @([Workflow.ComponentModel.Compiler.WorkflowCompilerParameters] $WFCompilerParams, [String[]] @(,$OutputPath))) | |
Move-Item $TempFile $OutputPath -PassThru | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment