diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 03954cb..cc65311 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -48,15 +48,20 @@ $PSVersion ### Development Environment If you want to build the module from source code yourself, you need to install these programs first: -- [Microsoft Visual Studio Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) 2015, 2017 or 2019 with these features installed: - * Common Tools for Visual C++ - * Windows SDK (you have to retarget the [DSInternals.Replication.Interop](../Src/DSInternals.Replication.Interop/DSInternals.Replication.Interop.vcxproj) project to the version you have) +- [Microsoft Visual Studio Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) 2022 with these features installed: + * .NET Framework 4.7.2 targeting pack + * C++ 2022 Redistributable Update + * C++/CLI support for v143 build tools (Latest) + * MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest) + * MSVC v143 - VS 2022 C++ ARM64/ARM64EC build tools (Latest) + * Windows Universal C Runtime + * Windows 11 SDK (you might have to retarget the [DSInternals.Replication.Interop](../Src/DSInternals.Replication.Interop/DSInternals.Replication.Interop.vcxproj) project to the version you have) * PowerShell Tools for Visual Studio (optional) * Git for Windows (optional) * GitHub Extension for Visual Studio (optional) - [Windows Management Framework 5](https://www.microsoft.com/en-us/download/details.aspx?id=50395). -To make IntelliSense work with *.psm1 files, the following code needs to be added to the `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Xml\Schemas\catalog.xml` file: +To make IntelliSense work with *.psm1 files, the following code needs to be added to the `C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Xml\Schemas\catalog.xml` file: ```xml diff --git a/.github/README.md b/.github/README.md index 4a8ec00..487e8ac 100644 --- a/.github/README.md +++ b/.github/README.md @@ -4,8 +4,9 @@ [![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](../LICENSE.md) [![PowerShell 3 | 4 | 5](https://img.shields.io/badge/PowerShell-3%20|%204%20|%205-0000FF.svg?logo=PowerShell)](#) -[![Windows Server 2008 R2 | 2012 R2 | 2016 | 2019 | 2022](https://img.shields.io/badge/Windows%20Server-2008%20R2%20|%202012%20R2%20|%202016%20|%202019%20|%202022-007bb8.svg?logo=Windows)](#) -[![.NET Framework 4.7.2+](https://img.shields.io/badge/.NET%20Framework-4.7.2%2B-007FFF.svg)](#) +[![Windows Server 2008 R2 | 2012 R2 | 2016 | 2019 | 2022](https://img.shields.io/badge/Windows%20Server-2008%20R2%20|%202012%20R2%20|%202016%20|%202019%20|%202022-007bb8.svg?logo=Windows%2011)](#) +[![.NET Framework 4.7.2+](https://img.shields.io/badge/Framework-4.7.2%2B-007FFF.svg?logo=.net)](#) +[![Architecture x64 | x86 | amd64](https://img.shields.io/badge/Architecture-x64%20|%20x86%20|%20ARM64-0071c5.svg?logo=Amazon%20EC2)](#) ## Introduction @@ -101,7 +102,7 @@ The easiest way of integrating the DSInternals functionality into .NET applicati ### Building from Source Code -[![Visual Studio 2017 | 2019](https://img.shields.io/badge/Visual%20Studio-2017%20|%202019-383278.svg?logo=Visual-Studio-Code)](CONTRIBUTING.md#building-from-source-code) +[![Visual Studio 2022](https://img.shields.io/badge/Visual%20Studio-2022-383278.svg?logo=Visual-Studio-Code)](CONTRIBUTING.md#building-from-source-code) [![Build Status](https://dev.azure.com/DSInternals/DSInternals%20CI/_apis/build/status/DSInternals?branchName=master)](https://dev.azure.com/DSInternals/DSInternals%20CI/_build/latest?definitionId=2&branchName=master) [![Test Results](https://img.shields.io/azure-devops/tests/DSInternals/DSInternals%20CI/2.svg?label=Test%20Results&logo=Azure-DevOps)](https://dev.azure.com/DSInternals/DSInternals%20CI/_build/latest?definitionId=2&branchName=master) diff --git a/Scripts/Build-Solution.ps1 b/Scripts/Build-Solution.ps1 index 4ae784b..2d87e75 100644 --- a/Scripts/Build-Solution.ps1 +++ b/Scripts/Build-Solution.ps1 @@ -15,7 +15,7 @@ Import-Module $modulePath -ErrorAction Stop $targets = 'Build' # 'Clean' $configurations = 'Release', 'Debug' -$platforms = 'x86','x64' +$platforms = 'x86','x64','ARM64' # Delete the entire Build directory if(Test-Path $buildDir) diff --git a/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psd1 b/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psd1 index 68fd6e3..e4d4818 100644 --- a/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psd1 +++ b/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psd1 @@ -12,7 +12,7 @@ RootModule = 'Invoke-MsBuild.psm1' # Version number of this module. -ModuleVersion = '2.6.2' +ModuleVersion = '2.7.1' # Supported PSEditions # CompatiblePSEditions = @() @@ -107,7 +107,9 @@ PrivateData = @{ # IconUri = '' # ReleaseNotes of this module - ReleaseNotes = '- Use native -WhatIf parameter functionality.' + ReleaseNotes = 'Fixes: + +- Compare MSBuild version numbers in other languages correctly.' } # End of PSData hashtable diff --git a/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psm1 b/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psm1 index 23ffe75..67e97df 100644 --- a/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psm1 +++ b/Scripts/Modules/Invoke-MSBuild/Invoke-MsBuild.psm1 @@ -56,9 +56,9 @@ function Invoke-MsBuild By default the build output is not shown in any window. NOTE: This switch will override the ShowBuildOutputInNewWindow switch. NOTE: There is a problem with the -NoNewWindow parameter of the Start-Process cmdlet; this is used for the ShowBuildOutputInCurrentWindow switch. - The bug is that in some PowerShell consoles, the build output is not directed back to the console calling this function, so nothing is displayed. - To avoid the build process from appearing to hang, PromptForInputBeforeClosing only has an effect with ShowBuildOutputInCurrentWindow when running - in the default "ConsoleHost" PowerShell console window, as we know it works properly with that console (it does not in other consoles like ISE, PowerGUI, etc.). + The bug is that in some PowerShell consoles, the build output is not directed back to the console calling this function, so nothing is displayed. + To avoid the build process from appearing to hang, PromptForInputBeforeClosing only has an effect with ShowBuildOutputInCurrentWindow when running + in the default "ConsoleHost" PowerShell console window, as we know it works properly with that console (it does not in other consoles like ISE, PowerGUI, etc.). .PARAMETER PromptForInputBeforeClosing If set, this switch will prompt the user for input after the build completes, and will not continue until the user presses a key. @@ -66,7 +66,7 @@ function Invoke-MsBuild NOTE: This switch cannot be used with the PassThru switch. NOTE: The user will need to provide input before execution will return back to the calling script (so do not use this switch for automated builds). NOTE: To avoid the build process from appearing to hang, PromptForInputBeforeClosing only has an effect with ShowBuildOutputInCurrentWindow when running - in the default "ConsoleHost" PowerShell console window, as we know it works properly with that console (it does not in other consoles like ISE, PowerGUI, etc.). + in the default "ConsoleHost" PowerShell console window, as we know it works properly with that console (it does not in other consoles like ISE, PowerGUI, etc.). .PARAMETER MsBuildFilePath By default this script will locate and use the latest version of MsBuild.exe on the machine. @@ -101,7 +101,7 @@ function Invoke-MsBuild BuildErrorsLogFilePath = The path to the build's error log file. ItemToBuildFilePath = The item that MsBuild ran against. CommandUsedToBuild = The full command that was used to invoke MsBuild. This can be useful for inspecting what parameters are passed to MsBuild.exe. - Message = A message describing any problems that were encoutered by Invoke-MsBuild. This is typically an empty string unless something went wrong. + Message = A message describing any problems that were encountered by Invoke-MsBuild. This is typically an empty string unless something went wrong. MsBuildProcess = The process that was used to execute MsBuild.exe. BuildDuration = The amount of time the build took to complete, represented as a TimeSpan. @@ -116,7 +116,7 @@ function Invoke-MsBuild { Write-Output ("Build failed after {0:N1} seconds. Check the build log file '$($buildResult.BuildLogFilePath)' for errors." -f $buildResult.BuildDuration.TotalSeconds) } - elseif ($buildResult.BuildSucceeded -eq $null) + elseif ($null -eq $buildResult.BuildSucceeded) { Write-Output "Unsure if build passed or failed: $($buildResult.Message)" } @@ -129,7 +129,7 @@ function Invoke-MsBuild while (!$process.HasExited) { - Write-Host "Solution is still buildling..." + Write-Host "Solution is still building..." Start-Sleep -Seconds 1 } @@ -143,7 +143,7 @@ function Invoke-MsBuild Write-Output "Build completed successfully." } - Perfom the build against the file specified at $pathToSolution and checks it for success in a single line. + Perform the build against the file specified at $pathToSolution and checks it for success in a single line. .EXAMPLE Invoke-MsBuild -Path "C:\Some Folder\MyProject.csproj" -MsBuildParameters "/target:Clean;Build" -ShowBuildOutputInNewWindow @@ -208,7 +208,7 @@ function Invoke-MsBuild .NOTES Name: Invoke-MsBuild Author: Daniel Schroeder (originally based on the module at http://geekswithblogs.net/dwdii/archive/2011/05/27/part-2-automating-a-visual-studio-build-with-powershell.aspx) - Version: 2.6.2 + Version: 2.7.1 #> [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName="Wait")] param @@ -284,7 +284,7 @@ function Invoke-MsBuild # Default the ParameterSet variables that may not have been set depending on which parameter set is being used. This is required for PowerShell v2.0 compatibility. if (!(Test-Path Variable:Private:AutoLaunchBuildLogOnFailure)) { $AutoLaunchBuildLogOnFailure = $false } - if (!(Test-Path Variable:Private:AutoLaunchBuildLogOnFailure)) { $AutoLaunchBuildErrorsLogOnFailure = $false } + if (!(Test-Path Variable:Private:AutoLaunchBuildErrorsLogOnFailure)) { $AutoLaunchBuildErrorsLogOnFailure = $false } if (!(Test-Path Variable:Private:KeepBuildLogOnSuccessfulBuilds)) { $KeepBuildLogOnSuccessfulBuilds = $false } if (!(Test-Path Variable:Private:PromptForInputBeforeClosing)) { $PromptForInputBeforeClosing = $false } if (!(Test-Path Variable:Private:PassThru)) { $PassThru = $false } @@ -331,12 +331,6 @@ function Invoke-MsBuild # Build the arguments to pass to MsBuild. $buildArguments = """$Path"" $MsBuildParameters /fileLoggerParameters:LogFile=""$buildLogFilePath""$verbosityLevel /fileLoggerParameters1:LogFile=""$buildErrorsLogFilePath"";errorsonly" - # If the user hasn't set the UseSharedCompilation mode explicitly, turn it off (it's on by default, but can cause MsBuild to hang for some reason). - if ($buildArguments -notlike '*UseSharedCompilation*') - { - $buildArguments += " /p:UseSharedCompilation=false " # prevent processes from hanging (Roslyn compiler?) - } - # Get the path to the MsBuild executable. $msBuildPath = $MsBuildFilePath [bool] $msBuildPathWasNotProvided = [string]::IsNullOrEmpty($msBuildPath) @@ -415,12 +409,14 @@ function Invoke-MsBuild { if ($ShowBuildOutputInCurrentWindow) { - $result.MsBuildProcess = Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuild -NoNewWindow -Wait -PassThru + $result.MsBuildProcess = Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuild -NoNewWindow -PassThru } else { - $result.MsBuildProcess = Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuild -WindowStyle $windowStyleOfNewWindow -Wait -PassThru + $result.MsBuildProcess = Start-Process cmd.exe -ArgumentList $cmdArgumentsToRunMsBuild -WindowStyle $windowStyleOfNewWindow -PassThru } + + Wait-Process -InputObject $result.MsBuildProcess } # Perform the build and record how long it takes. @@ -449,7 +445,7 @@ function Invoke-MsBuild } # Get if the build succeeded or not. - [bool] $buildOutputDoesNotContainFailureMessage = (Select-String -Path $buildLogFilePath -Pattern "Build FAILED." -SimpleMatch) -eq $null + [bool] $buildOutputDoesNotContainFailureMessage = $null -eq (Select-String -Path $buildLogFilePath -Pattern "Build FAILED." -SimpleMatch) [bool] $buildReturnedSuccessfulExitCode = $result.MsBuildProcess.ExitCode -eq 0 $buildSucceeded = $buildOutputDoesNotContainFailureMessage -and $buildReturnedSuccessfulExitCode @@ -528,7 +524,7 @@ function Get-VisualStudioCommandPromptPathForVisualStudio2017AndNewer { # Later we can probably make use of the VSSetup.PowerShell module to find the MsBuild.exe: https://github.com/Microsoft/vssetup.powershell # Or perhaps the VsWhere.exe: https://github.com/Microsoft/vswhere - # But for now, to keep this script PowerShell 2.0 compatible and not rely on external executables, let's look for it ourselve in known locations. + # But for now, to keep this script PowerShell 2.0 compatible and not rely on external executables, let's look for it ourselves in known locations. # Example of known locations: # "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat" @@ -543,10 +539,10 @@ function Get-VisualStudioCommandPromptPathForVisualStudio2017AndNewer $expectedVsCommandPromptPathWithWildcards = "$visualStudioDirectoryPath\*\*\Common7\Tools\VsDevCmd.bat" $vsCommandPromptPathObjects = Get-Item -Path $expectedVsCommandPromptPathWithWildcards - [bool] $vsCommandPromptWasNotFound = ($vsCommandPromptPathObjects -eq $null) -or ($vsCommandPromptPathObjects.Length -eq 0) + [bool] $vsCommandPromptWasNotFound = ($null -eq $vsCommandPromptPathObjects) -or ($vsCommandPromptPathObjects.Length -eq 0) if ($vsCommandPromptWasNotFound) { - # Recurisvely search the entire Microsoft Visual Studio directory for the VS Command Prompt (slower, but will still work if MS changes folder structure). + # Recursively search the entire Microsoft Visual Studio directory for the VS Command Prompt (slower, but will still work if MS changes folder structure). Write-Verbose "The Visual Studio Command Prompt was not found at an expected location. Searching more locations, but this will be a little slow." $vsCommandPromptPathObjects = Get-ChildItem -Path $visualStudioDirectoryPath -Recurse | Where-Object { $_.Name -ieq 'VsDevCmd.bat' } } @@ -582,6 +578,19 @@ function Get-VisualStudioCommandPromptPathForVisualStudio2015AndPrior return $newestVsCommandPromptPath } +function Get-LatestMsBuildPath_NotUsedYetButCouldBeIfNeeded +{ + [bool] $vsSetupExists = $null -ne (Get-Command Get-VSSetupInstance -ErrorAction SilentlyContinue) + if (!$vsSetupExists) + { + Write-Verbose "Importing the VSSetup module in order to determine TF.exe path..." -Verbose + Install-Module VSSetup -Scope CurrentUser -Force + } + [string] $visualStudioInstallationPath = (Get-VSSetupInstance | Select-VSSetupInstance -Latest -Require Microsoft.Component.MSBuild).InstallationPath + $msBuildExecutableFilePath = (Get-ChildItem $visualStudioInstallationPath -Recurse -Filter "MsBuild.exe" | Select-Object -First 1).FullName + return $msBuildExecutableFilePath +} + function Get-LatestMsBuildPath([switch] $Use32BitMsBuild) { <# @@ -616,14 +625,16 @@ function Get-LatestMsBuildPath([switch] $Use32BitMsBuild) return $msBuildPath } -function Get-MsBuildPathForVisualStudio2017AndNewer([switch] $Use32BitMsBuild) +function Get-MsBuildPathForVisualStudio2017AndNewer([bool] $Use32BitMsBuild) { # Later we can probably make use of the VSSetup.PowerShell module to find the MsBuild.exe: https://github.com/Microsoft/vssetup.powershell # Or perhaps the VsWhere.exe: https://github.com/Microsoft/vswhere - # But for now, to keep this script PowerShell 2.0 compatible and not rely on external executables, let's look for it ourselve in known locations. + # But for now, to keep this script PowerShell 2.0 compatible and not rely on external executables, let's look for it ourselves in known locations. # Example of known locations: # "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" - 32 bit # "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\amd64\MSBuild.exe" - 64 bit + # "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" -32 bit + # "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\amd64\MSBuild.exe" - 64 bit [string] $visualStudioDirectoryPath = Get-CommonVisualStudioDirectoryPath [bool] $visualStudioDirectoryPathDoesNotExist = [string]::IsNullOrEmpty($visualStudioDirectoryPath) @@ -637,10 +648,10 @@ function Get-MsBuildPathForVisualStudio2017AndNewer([switch] $Use32BitMsBuild) $expected64bitPathWithWildcards = "$visualStudioDirectoryPath\*\*\MsBuild\*\Bin\amd64\MsBuild.exe" $msBuildPathObjects = Get-Item -Path $expected32bitPathWithWildcards, $expected64bitPathWithWildcards - [bool] $msBuildWasNotFound = ($msBuildPathObjects -eq $null) -or ($msBuildPathObjects.Length -eq 0) + [bool] $msBuildWasNotFound = ($null -eq $msBuildPathObjects) -or ($msBuildPathObjects.Length -eq 0) if ($msBuildWasNotFound) { - # Recurisvely search the entire Microsoft Visual Studio directory for MsBuild (slower, but will still work if MS changes folder structure). + # Recursively search the entire Microsoft Visual Studio directory for MsBuild (slower, but will still work if MS changes folder structure). Write-Verbose "MsBuild.exe was not found at an expected location. Searching more locations, but this will be a little slow." $msBuildPathObjects = Get-ChildItem -Path $visualStudioDirectoryPath -Recurse | Where-Object { $_.Name -ieq 'MsBuild.exe' } } @@ -657,7 +668,7 @@ function Get-MsBuildPathForVisualStudio2017AndNewer([switch] $Use32BitMsBuild) return $newest64BitMsBuildPath } -function Get-MsBuildPathForVisualStudio2015AndPrior([switch] $Use32BitMsBuild) +function Get-MsBuildPathForVisualStudio2015AndPrior([bool] $Use32BitMsBuild) { $registryPathToMsBuildToolsVersions = 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' if ($Use32BitMsBuild) @@ -670,6 +681,10 @@ function Get-MsBuildPathForVisualStudio2015AndPrior([switch] $Use32BitMsBuild) } } + # Backup the current culture and force using English US to ensure version numbers are in the expected format (e.g. 17.0). + $previousCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture + [System.Threading.Thread]::CurrentThread.CurrentCulture = 'en-US' + # Get the path to the directory that the latest version of MsBuild is in. $msBuildToolsVersionsStrings = Get-ChildItem -Path $registryPathToMsBuildToolsVersions | Where-Object { $_ -match '[0-9]+\.[0-9]' } | Select-Object -ExpandProperty PsChildName $msBuildToolsVersions = @{} @@ -679,6 +694,9 @@ function Get-MsBuildPathForVisualStudio2015AndPrior([switch] $Use32BitMsBuild) $msBuildToolsVersionsKeyToUse = Get-Item -Path $registryPathToMsBuildToolsLatestVersion $msBuildDirectoryPath = $msBuildToolsVersionsKeyToUse | Get-ItemProperty -Name 'MSBuildToolsPath' | Select-Object -ExpandProperty 'MSBuildToolsPath' + # Restore the previous culture now that we're done comparing version numbers. + [System.Threading.Thread]::CurrentThread.CurrentCulture = $previousCulture + if(!$msBuildDirectoryPath) { return $null @@ -692,25 +710,28 @@ function Get-MsBuildPathForVisualStudio2015AndPrior([switch] $Use32BitMsBuild) function Get-CommonVisualStudioDirectoryPath { + # As of VS 2022 Visual Studio is 64-bit, so look in "Program Files" directory before "Program Files (x86)". [string] $programFilesDirectory = $null try { - $programFilesDirectory = Get-Item 'Env:\ProgramFiles(x86)' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value + $programFilesDirectory = Get-Item 'Env:\ProgramFiles' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value } catch { } if ([string]::IsNullOrEmpty($programFilesDirectory)) { - $programFilesDirectory = 'C:\Program Files (x86)' + $programFilesDirectory = 'C:\Program Files' } - # If we're on a 32-bit machine, we need to go straight after the "Program Files" directory. - if (!(Test-Path -LiteralPath $programFilesDirectory -PathType Container)) + [string] $visualStudioDirectoryPath = Join-Path -Path $programFilesDirectory -ChildPath 'Microsoft Visual Studio' + [bool] $visualStudioDirectoryPathExists = (Test-Path -LiteralPath $visualStudioDirectoryPath -PathType Container) + if (!$visualStudioDirectoryPathExists) { + # Look for Visual Studio in "Program Files (x86)" directory. try { - $programFilesDirectory = Get-Item 'Env:\ProgramFiles' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value + $programFilesDirectory = Get-Item 'Env:\ProgramFiles(x86)' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value } catch { @@ -719,13 +740,12 @@ function Get-CommonVisualStudioDirectoryPath if ([string]::IsNullOrEmpty($programFilesDirectory)) { - $programFilesDirectory = 'C:\Program Files' + $programFilesDirectory = 'C:\Program Files (x86)' } } - [string] $visualStudioDirectoryPath = Join-Path -Path $programFilesDirectory -ChildPath 'Microsoft Visual Studio' - - [bool] $visualStudioDirectoryPathExists = (Test-Path -LiteralPath $visualStudioDirectoryPath -PathType Container) + $visualStudioDirectoryPath = Join-Path -Path $programFilesDirectory -ChildPath 'Microsoft Visual Studio' + $visualStudioDirectoryPathExists = (Test-Path -LiteralPath $visualStudioDirectoryPath -PathType Container) if (!$visualStudioDirectoryPathExists) { return $null diff --git a/Src/Configuration/Common.vcxproj.props b/Src/Configuration/Common.vcxproj.props index 5c9a507..5a31343 100644 --- a/Src/Configuration/Common.vcxproj.props +++ b/Src/Configuration/Common.vcxproj.props @@ -10,6 +10,8 @@ --> amd64 x86 + arm + arm64 @@ -21,4 +23,4 @@ $(SigningKeyPath) $(PerformDelaySign) - \ No newline at end of file + diff --git a/Src/DSInternals.PowerShell/DSInternals.Bootstrap.psm1 b/Src/DSInternals.PowerShell/DSInternals.Bootstrap.psm1 index bc5ca18..b380d23 100644 --- a/Src/DSInternals.PowerShell/DSInternals.Bootstrap.psm1 +++ b/Src/DSInternals.PowerShell/DSInternals.Bootstrap.psm1 @@ -13,7 +13,7 @@ [string] $interopAssemblyPath = Join-Path $PSScriptRoot "$env:PROCESSOR_ARCHITECTURE\DSInternals.Replication.Interop.dll" try { - Add-Type -Path $interopAssemblyPath + Add-Type -Path $interopAssemblyPath -ErrorAction Stop } catch [System.IO.IOException] { @@ -26,7 +26,7 @@ catch [System.IO.IOException] # Check the presence of the Universal C Runtime [string] $ucrtPath = Join-Path ([System.Environment]::SystemDirectory) 'ucrtbase.dll' - [bool] $ucrtPresent = Test-Path $ucrtPath + [bool] $ucrtPresent = Test-Path -Path $ucrtPath if(-not $ucrtPresent) { @@ -36,7 +36,7 @@ catch [System.IO.IOException] } # Check if the interop assembly is blocked - [object] $zoneIdentifier = Get-Item $interopAssemblyPath -Stream 'Zone.Identifier' -ErrorAction SilentlyContinue + [object] $zoneIdentifier = Get-Item -Path $interopAssemblyPath -Stream 'Zone.Identifier' -ErrorAction SilentlyContinue if($zoneIdentifier -ne $null) { diff --git a/Src/DSInternals.PowerShell/DSInternals.psd1 b/Src/DSInternals.PowerShell/DSInternals.psd1 index c4713a2..3d4406f 100644 --- a/Src/DSInternals.PowerShell/DSInternals.psd1 +++ b/Src/DSInternals.PowerShell/DSInternals.psd1 @@ -41,7 +41,7 @@ DotNetFrameworkVersion = '4.7.2' # This requirement is not enforced by older ver # Minimum version of the common language runtime (CLR) required by this module CLRVersion = '4.0.30319.42000' # Corresponds to .NET Framework 4.6 and later -# Processor architecture (None, X86, Amd64) required by this module +# Processor architecture (None, X86, Amd64, ARM64) required by this module ProcessorArchitecture = 'None' # Type files (.ps1xml) to be loaded when importing this module @@ -118,6 +118,7 @@ FileList = 'AutoMapper.dll', 'Newtonsoft.Json.dll', 'Numbers.dll', 'amd64\DSInternals.Replication.Interop.dll', + 'arm64\DSInternals.Replication.Interop.dll', 'x86\DSInternals.Replication.Interop.dll', 'en-US\about_DSInternals.help.txt', 'en-US\DSInternals.PowerShell.dll-Help.xml' diff --git a/Src/DSInternals.PowerShell/Tests/DSInternals.Smoke.Tests.ps1 b/Src/DSInternals.PowerShell/Tests/DSInternals.Smoke.Tests.ps1 index 48ef17b..d44a89c 100644 --- a/Src/DSInternals.PowerShell/Tests/DSInternals.Smoke.Tests.ps1 +++ b/Src/DSInternals.PowerShell/Tests/DSInternals.Smoke.Tests.ps1 @@ -90,10 +90,10 @@ Describe 'DSInternals PowerShell Module' { $licenseFile | Should -FileContentMatch ('Copyright \(c\) 2015-{0}' -f (Get-Date).Year) } - It 'contains Visual C++ Runtime ()' -TestCases @{ Platform = 'x86' },@{ Platform = 'amd64' } -Test { + It 'contains Visual C++ Runtime ()' -TestCases @{ Platform = 'x86' },@{ Platform = 'amd64' },@{ Platform = 'arm64' } -Test { param([string] $Platform) - # Regardless of the runtime version, we expect 2-3 additional DLLs to be present in the x86/amd64 directory + # Regardless of the runtime version, we expect 2-3 additional DLLs to be present in the x86/amd64/arm64 directory $platformSpecificPath = Join-Path $ModulePath $Platform Get-ChildItem -Path $platformSpecificPath -Recurse -Include msvc*,vcruntime* | Measure-Object | diff --git a/Src/DSInternals.Replication.Interop/DSInternals.Replication.Interop.vcxproj b/Src/DSInternals.Replication.Interop/DSInternals.Replication.Interop.vcxproj index 1802ffa..a9ba565 100644 --- a/Src/DSInternals.Replication.Interop/DSInternals.Replication.Interop.vcxproj +++ b/Src/DSInternals.Replication.Interop/DSInternals.Replication.Interop.vcxproj @@ -2,6 +2,14 @@ + + Debug + ARM + + + Debug + ARM64 + Debug Win32 @@ -10,6 +18,14 @@ Debug x64 + + Release + ARM + + + Release + ARM64 + Release Win32 @@ -46,6 +62,20 @@ true Unicode + + DynamicLibrary + true + $(DefaultPlatformToolSet) + true + Unicode + + + DynamicLibrary + true + $(DefaultPlatformToolSet) + true + Unicode + DynamicLibrary false @@ -60,6 +90,20 @@ true Unicode + + DynamicLibrary + false + $(DefaultPlatformToolSet) + true + Unicode + + + DynamicLibrary + false + $(DefaultPlatformToolSet) + true + Unicode + @@ -69,12 +113,24 @@ + + + + + + + + + + + + true @@ -84,6 +140,16 @@ true $(ProjectDir);$(IncludePath) + + true + $(ProjectDir);$(IncludePath) + false + + + true + $(ProjectDir);$(IncludePath) + false + false $(ProjectDir);$(IncludePath) @@ -92,6 +158,16 @@ false $(ProjectDir);$(IncludePath) + + false + $(ProjectDir);$(IncludePath) + false + + + false + $(ProjectDir);$(IncludePath) + false + Level3 @@ -150,6 +226,64 @@ All + + + Level3 + Disabled + WIN32;_DEBUG;%(PreprocessorDefinitions) + Use + MultiThreadedDebugDLL + false + true + stdafx.h + + + DebugFull + RpcRT4.lib;Secur32.lib + Default + + + %(Filename).h + + + Stub + + + None + %(Filename).cpp + false + All + + + + + Level3 + Disabled + WIN32;_DEBUG;%(PreprocessorDefinitions) + Use + MultiThreadedDebugDLL + false + true + stdafx.h + + + DebugFull + RpcRT4.lib;Secur32.lib + Default + + + %(Filename).h + + + Stub + + + None + %(Filename).cpp + false + All + + Level3 @@ -200,6 +334,56 @@ %(Filename).cpp + + + Level3 + WIN32;NDEBUG;%(PreprocessorDefinitions) + Use + MultiThreadedDLL + Async + stdafx.h + + + false + Rpcrt4.lib;Secur32.lib + Default + + + %(Filename).h + + + Stub + + + None + %(Filename).cpp + + + + + Level3 + WIN32;NDEBUG;%(PreprocessorDefinitions) + Use + MultiThreadedDLL + Async + stdafx.h + + + false + Rpcrt4.lib;Secur32.lib + Default + + + %(Filename).h + + + Stub + + + None + %(Filename).cpp + + @@ -220,7 +404,11 @@ stdafx.h;unmanaged.h;%(ForcedIncludeFiles) + stdafx.h;unmanaged.h;%(ForcedIncludeFiles) + stdafx.h;unmanaged.h;%(ForcedIncludeFiles) stdafx.h;unmanaged.h;%(ForcedIncludeFiles) + stdafx.h;unmanaged.h;%(ForcedIncludeFiles) + stdafx.h;unmanaged.h;%(ForcedIncludeFiles) stdafx.h;unmanaged.h;%(ForcedIncludeFiles) stdafx.h;unmanaged.h;%(ForcedIncludeFiles) @@ -258,35 +446,32 @@ false + false + false false true + true + true true true + true + true true - - - - $(VCInstallDir)\redist\x64\Microsoft.VC$(PlatformToolsetVersion).CRT - $(VCInstallDir)\redist\x86\Microsoft.VC$(PlatformToolsetVersion).CRT - - - - $(VCInstallDir)\Tools\MSVC\$(VCToolsVersion)\bin\Hostx64\x64 - $(VCInstallDir)\Tools\MSVC\$(VCToolsVersion)\bin\Hostx86\x86 - - + - robocopy.exe "$(VCRuntimePath)" "$(OutDir)\." "msvcp*.dll" "msvcr*.dll" "vcruntime*.dll" /xf "msvcp*_*.dll" /FP /NP /NDL /NS /NJH /NJS + robocopy.exe "$(CppRuntimeFilesPath.Replace(';',''))\Microsoft.VC$(PlatformToolsetVersion).CRT" "$(OutDir)\." "msvcp*.dll" "msvcr*.dll" "vcruntime*.dll" /xf "msvcp*_*.dll" /FP /NP /NDL /NS /NJH /NJS IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0 - $(OutDir)\msvcr$(PlatformToolsetVersion).dll;$(OutDir)\msvcp$(PlatformToolsetVersion).dll;$(OutDir)\vcruntime$(PlatformToolsetVersion).dll;$(OutDir)\msvcp140.dll;$(OutDir)\vcruntime140.dll + $(OutDir)\msvcp140.dll;$(OutDir)\vcruntime140.dll;$(OutDir)\vcruntime140_1.dll Copying VC Runtime diff --git a/Src/DSInternals.sln b/Src/DSInternals.sln index 39379c4..38d2cfd 100644 --- a/Src/DSInternals.sln +++ b/Src/DSInternals.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.352 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33627.172 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DSInternals.PowerShell", "DSInternals.PowerShell\DSInternals.PowerShell.csproj", "{C7EECC1F-1F9C-400B-A981-A8106E2A75F7}" EndProject @@ -63,6 +63,8 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Documentation", "Documentation", "{9735D030-AEE6-415A-BF03-074076FF776A}" ProjectSection(SolutionItems) = preProject ..\Documentation\CHANGELOG.md = ..\Documentation\CHANGELOG.md + ..\.github\CONTRIBUTING.md = ..\.github\CONTRIBUTING.md + ..\.github\README.md = ..\.github\README.md EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Database.Isam", "Microsoft.Database.Isam\Microsoft.Database.Isam.csproj", "{21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}" @@ -121,106 +123,200 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PowerShell", "PowerShell", EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|ARM.ActiveCfg = Debug|Any CPU + {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|ARM.Build.0 = Debug|Any CPU + {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|ARM64.Build.0 = Debug|Any CPU {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|x64.ActiveCfg = Debug|Any CPU {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|x64.Build.0 = Debug|Any CPU {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|x86.ActiveCfg = Debug|Any CPU {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Debug|x86.Build.0 = Debug|Any CPU + {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Release|ARM.ActiveCfg = Release|Any CPU + {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Release|ARM64.ActiveCfg = Release|Any CPU {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Release|x64.ActiveCfg = Release|Any CPU {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Release|x86.ActiveCfg = Release|Any CPU {C7EECC1F-1F9C-400B-A981-A8106E2A75F7}.Release|x86.Build.0 = Release|Any CPU + {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|ARM.ActiveCfg = Debug|Any CPU + {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|ARM.Build.0 = Debug|Any CPU + {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|ARM64.Build.0 = Debug|Any CPU {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|x64.ActiveCfg = Debug|Any CPU {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|x64.Build.0 = Debug|Any CPU {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|x86.ActiveCfg = Debug|Any CPU {924F67C0-8FFF-4714-891A-FC0799F46727}.Debug|x86.Build.0 = Debug|Any CPU + {924F67C0-8FFF-4714-891A-FC0799F46727}.Release|ARM.ActiveCfg = Release|Any CPU + {924F67C0-8FFF-4714-891A-FC0799F46727}.Release|ARM64.ActiveCfg = Release|Any CPU {924F67C0-8FFF-4714-891A-FC0799F46727}.Release|x64.ActiveCfg = Release|Any CPU {924F67C0-8FFF-4714-891A-FC0799F46727}.Release|x86.ActiveCfg = Release|Any CPU {924F67C0-8FFF-4714-891A-FC0799F46727}.Release|x86.Build.0 = Release|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|ARM.ActiveCfg = Debug|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|ARM.Build.0 = Debug|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|ARM64.Build.0 = Debug|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|x64.ActiveCfg = Debug|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|x64.Build.0 = Debug|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|x86.ActiveCfg = Debug|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Debug|x86.Build.0 = Debug|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|ARM.ActiveCfg = Release|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|ARM.Build.0 = Release|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|ARM64.ActiveCfg = Release|Any CPU + {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|ARM64.Build.0 = Release|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|x64.ActiveCfg = Release|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|x64.Build.0 = Release|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|x86.ActiveCfg = Release|Any CPU {7D47F040-D3A9-43CA-9F69-EF91FAF2C23A}.Release|x86.Build.0 = Release|Any CPU + {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|ARM.Build.0 = Debug|Any CPU + {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|ARM64.Build.0 = Debug|Any CPU {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|x64.ActiveCfg = Debug|Any CPU {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|x64.Build.0 = Debug|Any CPU {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|x86.ActiveCfg = Debug|Any CPU {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Debug|x86.Build.0 = Debug|Any CPU + {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Release|ARM.ActiveCfg = Release|Any CPU + {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Release|ARM64.ActiveCfg = Release|Any CPU {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Release|x64.ActiveCfg = Release|Any CPU {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Release|x86.ActiveCfg = Release|Any CPU {8A857B97-1BE0-4BAE-A4E8-DEE870858BFD}.Release|x86.Build.0 = Release|Any CPU + {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|ARM.ActiveCfg = Debug|Any CPU + {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|ARM.Build.0 = Debug|Any CPU + {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|ARM64.Build.0 = Debug|Any CPU {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|x64.ActiveCfg = Debug|Any CPU {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|x64.Build.0 = Debug|Any CPU {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|x86.ActiveCfg = Debug|Any CPU {744163E3-AEDA-407C-A917-7C406977B4B8}.Debug|x86.Build.0 = Debug|Any CPU + {744163E3-AEDA-407C-A917-7C406977B4B8}.Release|ARM.ActiveCfg = Release|Any CPU + {744163E3-AEDA-407C-A917-7C406977B4B8}.Release|ARM64.ActiveCfg = Release|Any CPU {744163E3-AEDA-407C-A917-7C406977B4B8}.Release|x64.ActiveCfg = Release|Any CPU {744163E3-AEDA-407C-A917-7C406977B4B8}.Release|x86.ActiveCfg = Release|Any CPU + {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|ARM.ActiveCfg = Debug|Any CPU + {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|ARM.Build.0 = Debug|Any CPU + {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|ARM64.Build.0 = Debug|Any CPU {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|x64.ActiveCfg = Debug|Any CPU {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|x64.Build.0 = Debug|Any CPU {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|x86.ActiveCfg = Debug|Any CPU {91377A6C-52EE-4267-9D6A-1475E2183648}.Debug|x86.Build.0 = Debug|Any CPU + {91377A6C-52EE-4267-9D6A-1475E2183648}.Release|ARM.ActiveCfg = Release|Any CPU + {91377A6C-52EE-4267-9D6A-1475E2183648}.Release|ARM64.ActiveCfg = Release|Any CPU {91377A6C-52EE-4267-9D6A-1475E2183648}.Release|x64.ActiveCfg = Release|Any CPU {91377A6C-52EE-4267-9D6A-1475E2183648}.Release|x86.ActiveCfg = Release|Any CPU + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|ARM.ActiveCfg = Debug|ARM + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|ARM.Build.0 = Debug|ARM + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|ARM64.Build.0 = Debug|ARM64 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|x64.ActiveCfg = Debug|x64 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|x64.Build.0 = Debug|x64 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|x86.ActiveCfg = Debug|Win32 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Debug|x86.Build.0 = Debug|Win32 + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|ARM.ActiveCfg = Release|ARM + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|ARM.Build.0 = Release|ARM + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|ARM64.ActiveCfg = Release|ARM64 + {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|ARM64.Build.0 = Release|ARM64 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|x64.ActiveCfg = Release|x64 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|x64.Build.0 = Release|x64 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|x86.ActiveCfg = Release|Win32 {A70A6658-DD67-4C73-AB9A-581465137C6B}.Release|x86.Build.0 = Release|Win32 + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|ARM.Build.0 = Debug|Any CPU + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|ARM64.Build.0 = Debug|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|x64.ActiveCfg = Debug|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|x64.Build.0 = Debug|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|x86.ActiveCfg = Debug|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Debug|x86.Build.0 = Debug|Any CPU + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|ARM.ActiveCfg = Release|Any CPU + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|ARM.Build.0 = Release|Any CPU + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|ARM64.ActiveCfg = Release|Any CPU + {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|ARM64.Build.0 = Release|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|x64.ActiveCfg = Release|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|x64.Build.0 = Release|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|x86.ActiveCfg = Release|Any CPU {0BCA513C-5F12-48B6-8288-D3A95EC2994A}.Release|x86.Build.0 = Release|Any CPU + {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|ARM.Build.0 = Debug|Any CPU + {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|ARM64.Build.0 = Debug|Any CPU {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|x64.ActiveCfg = Debug|Any CPU {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|x64.Build.0 = Debug|Any CPU {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|x86.ActiveCfg = Debug|Any CPU {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Debug|x86.Build.0 = Debug|Any CPU + {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Release|ARM.ActiveCfg = Release|Any CPU + {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Release|ARM64.ActiveCfg = Release|Any CPU {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Release|x64.ActiveCfg = Release|Any CPU {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Release|x86.ActiveCfg = Release|Any CPU {2EE0D48F-65BA-4D4F-A8E1-FC01349BA786}.Release|x86.Build.0 = Release|Any CPU + {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|ARM.ActiveCfg = Debug|Any CPU + {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|ARM.Build.0 = Debug|Any CPU + {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|ARM64.Build.0 = Debug|Any CPU {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|x64.ActiveCfg = Debug|Any CPU {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|x64.Build.0 = Debug|Any CPU {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|x86.ActiveCfg = Debug|Any CPU {11DB6E06-E5E4-4612-9062-0B8E68099880}.Debug|x86.Build.0 = Debug|Any CPU + {11DB6E06-E5E4-4612-9062-0B8E68099880}.Release|ARM.ActiveCfg = Release|Any CPU + {11DB6E06-E5E4-4612-9062-0B8E68099880}.Release|ARM64.ActiveCfg = Release|Any CPU {11DB6E06-E5E4-4612-9062-0B8E68099880}.Release|x64.ActiveCfg = Release|Any CPU {11DB6E06-E5E4-4612-9062-0B8E68099880}.Release|x86.ActiveCfg = Release|Any CPU + {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|ARM.ActiveCfg = Debug|Any CPU + {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|ARM.Build.0 = Debug|Any CPU + {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|ARM64.Build.0 = Debug|Any CPU {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|x64.ActiveCfg = Debug|Any CPU {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|x64.Build.0 = Debug|Any CPU {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|x86.ActiveCfg = Debug|Any CPU {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Debug|x86.Build.0 = Debug|Any CPU + {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Release|ARM.ActiveCfg = Release|Any CPU + {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Release|ARM64.ActiveCfg = Release|Any CPU {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Release|x64.ActiveCfg = Release|Any CPU {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Release|x86.ActiveCfg = Release|Any CPU {21CC632C-B09A-4DB7-BD6E-7F7D2716F58F}.Release|x86.Build.0 = Release|Any CPU + {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|ARM.Build.0 = Debug|Any CPU + {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|ARM64.Build.0 = Debug|Any CPU {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|x64.ActiveCfg = Debug|Any CPU {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|x64.Build.0 = Debug|Any CPU {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|x86.ActiveCfg = Debug|Any CPU {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Debug|x86.Build.0 = Debug|Any CPU + {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Release|ARM.ActiveCfg = Release|Any CPU + {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Release|ARM64.ActiveCfg = Release|Any CPU {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Release|x64.ActiveCfg = Release|Any CPU {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Release|x86.ActiveCfg = Release|Any CPU {E929E163-52A0-4AAC-917B-6D7FAF70C45E}.Release|x86.Build.0 = Release|Any CPU + {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|ARM.Build.0 = Debug|Any CPU + {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|ARM64.Build.0 = Debug|Any CPU {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|x64.ActiveCfg = Debug|Any CPU {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|x64.Build.0 = Debug|Any CPU {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|x86.ActiveCfg = Debug|Any CPU {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Debug|x86.Build.0 = Debug|Any CPU + {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Release|ARM.ActiveCfg = Release|Any CPU + {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Release|ARM64.ActiveCfg = Release|Any CPU {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Release|x64.ActiveCfg = Release|Any CPU {B7E02A94-DA21-4302-82A6-2D4B7F279F21}.Release|x86.ActiveCfg = Release|Any CPU + {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|ARM.ActiveCfg = Debug|Any CPU + {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|ARM.Build.0 = Debug|Any CPU + {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|ARM64.Build.0 = Debug|Any CPU {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|x64.ActiveCfg = Debug|Any CPU {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|x64.Build.0 = Debug|Any CPU {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|x86.ActiveCfg = Debug|Any CPU {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Debug|x86.Build.0 = Debug|Any CPU + {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Release|ARM.ActiveCfg = Release|Any CPU + {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Release|ARM64.ActiveCfg = Release|Any CPU {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Release|x64.ActiveCfg = Release|Any CPU {7420D8C2-14BE-40F2-B724-A88D27BC6743}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection