I did an issue for nunit to get their CI builds for nunit running in appveyor, previously they had a manual process for CF checking.
The changes are all in this commit
To go into a bit of detail, I found a similar requirement with an R project someone had done, so did something similar, in that we used the appveyor.yml “install” step, to execute a powershell script that downloads and installs an msi on the box.
The bulk of the script below is pretty straight forward, all I’ve done is create a repo for the msi files, download and run them with msiexec on the box, with some very verbose checking. As isolated build boxes like appveyor if something goes wrong its nice to have a lot of log output.
$url= "https://github.com/dicko2/CompactFrameworkBuildBins/raw/master/NETCFSetupv35.msi"; Progress ("Downloading NETCFSetupv35 from: " $url) Invoke-WebRequest -Uri $url -OutFile NETCFSetupv35.msi $url= "https://github.com/dicko2/CompactFrameworkBuildBins/raw/master/NETCFv35PowerToys.msi"; Progress ("Downloading NETCFv35PowerToys from: " $url) Invoke-WebRequest -Uri $url -OutFile NETCFv35PowerToys.msi Progress("Running NETCFSetupv35 installer") $msi = @("NETCFSetupv35.msi","NETCFv35PowerToys.msi") foreach ($msifile in $msi) { if(!(Test-Path($msi))) { throw "MSI files are not present, please check logs." } Progress("Installing msi " $msifile ) Start-Process -FilePath "$env:systemroot\system32\msiexec.exe" -ArgumentList "/i `"$msifile`" /qn /norestart" -Wait -WorkingDirectory $pwd -RedirectStandardOutput stdout.txt -RedirectStandardError stderr.txt $OutputText = get-content stdout.txt Progress($OutputText) $OutputText = get-content stderr.txt Progress($OutputText) } if(!(Test-Path("C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.CSharp.targets"))) { throw "Compact framework files not found after install, install may have failed, please check logs." } RegistryWorkAround
You’ll note at the end though there is a call to “RegistryWorkaround”, i got these errors after setting the above up
The “AddHighDPIResource” task failed unexpectedly.
System.ArgumentNullException: Value cannot be null.
Parameter name: path1
After a quick google check found this forum post about the error and it solved my problem. You can see my work around below.
$registryPaths = @("HKLM:\SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VS","HKLM:\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Setup\VS") $Name = "ProductDir" $value = "C:\Program Files (x86)\Microsoft Visual Studio 9.0" foreach($registryPath in $registryPaths) { If(!(Test-Path $registryPath)) { New-Item -Path $registryPath -Force | Out-Null } If(!(Test-Path $registryPath+"\"+$Name)) { New-ItemProperty -Path $registryPath -Name $name -Value $value ` -PropertyType String -Force | Out-Null } If(!((Get-ItemProperty -Path $registryPath -Name $Name).ProductDir -eq "C:\Program Files (x86)\Microsoft Visual Studio 9.0")) { throw "Registry path " $registryPath " not set to correct value, please check logs" } else { Progress("Regsitry update ok to value " (Get-ItemProperty -Path $registryPath -Name $Name).ProductDir) } }
After all that it only adds less than 10 seconds on average to the build too which is good.
And now we have a working Compact Framework build in Appveyor!