I want to cancel the installation if the NetCore 3.1 (preview) is not installed
I create this CustomAction :
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Win32;
namespace WixCustomAction
{
public class CustomActions
{
[CustomAction]
public static ActionResult CheckDotNetCore31Installed(Session session)
{
session.Log("Begin CheckDotNetCore31Installed");
RegistryKey lKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost");
var version = (string)lKey.GetValue("Version");
session["DOTNETCORE31"] = version == "3.1.0-preview3.19553.2" ? "1" : "0";
return ActionResult.Success;
}
}
}
Then in the WXS file :
<<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<Product ...>
(...)
<Property Id="DOTNETCORE31">0</Property>
<Condition Message="You must first install the .NET Core 3.1 Runtime">
Installed OR DOTNETCORE31="1"
</Condition>
<InstallExecuteSequence>
<Custom Action="Check.NetCore" Before="LaunchConditions">NOT Installed</Custom>
</InstallExecuteSequence>
</Product>
<Fragment>
<Binary Id="WixCA.dll" SourceFile="$(var.WixCustomAction.TargetDir)$(var.WixCustomAction.TargetName).CA.dll" />
<CustomAction Id="Check.NetCore" BinaryKey="WixCA.dll" DllEntry="CheckDotNetCore31Installed" Execute="immediate" />
</Fragment>
And this is where I have a problem because I always get the warning message. An idea ? thanks
maybe it will be better to check .net core version using cmd with
dotnet --version
command, to avoid windows architecture dependencies
custom action sample for this case:
[CustomAction]
public static ActionResult CheckVersion(Session session)
{
var minVersion = new Version(3, 1, 1);
var command = "/c dotnet --version";// /c is important here
var output = string.Empty;
using (var p = new Process())
{
p.StartInfo = new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = command,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
};
p.Start();
while (!p.StandardOutput.EndOfStream)
{
output += $"{p.StandardOutput.ReadLine()}{Environment.NewLine}";
}
p.WaitForExit();
if (p.ExitCode != 0)
{
session["DOTNETCORE1"] = "0";
return ActionResult.Success;
//throw new Exception($"{p.ExitCode}:{ p.StandardError.ReadToEnd()}");
}
//you can implement here your own comparing algorithm
//mine will not work with -perview string, but in this case you can just
//replace all alphabetical symbols with . using regex, for example
var currentVersion = Version.Parse(output);
session["DOTNETCORE1"] = (currentVersion < minVersion) ? "0" : "1";
return ActionResult.Success;
}
UPDATE: As Adam mentioned, I was wrong with that snippet - it works only for SDKs. Here's another one to get runtimes:
static readonly List<string> runtimes = new List<string>()
{
"Microsoft.NETCore.App",//.NET Runtime
"Microsoft.AspNetCore.App",//ASP.NET Core Runtime
"Microsoft.WindowsDesktop.App",//.NET Desktop Runtime
};
[CustomAction]
public static ActionResult CheckVersion(Session session)
{
var minVersion = new Version(3, 1, 1);
var command = "/c dotnet --list-runtimes";// /c is important here
var output = string.Empty;
using (var p = new Process())
{
p.StartInfo = new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = command,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
};
p.Start();
while (!p.StandardOutput.EndOfStream)
{
output += $"{p.StandardOutput.ReadLine()}{Environment.NewLine}";
}
p.WaitForExit();
if (p.ExitCode != 0)
{
session["DOTNETCORE1"] = "0";
return ActionResult.Success;
//throw new Exception($"{p.ExitCode}:{ p.StandardError.ReadToEnd()}");
}
session["DOTNETCORE1"] = (GetLatestVersionOfRuntime(runtimes[0], output) < minVersion) ? "0" : "1";
return ActionResult.Success;
}
}
private static Version GetLatestVersionOfRuntime(string runtime, string runtimesList)
{
var latestLine = runtimesList.Split(Environment.NewLine).ToList().Where(x => x.Contains(runtime)).OrderBy(x => x).LastOrDefault();
if (latestLine != null)
{
Regex pattern = new Regex(@"\d+(\.\d+)+");
Match m = pattern.Match(latestLine);
string versionValue = m.Value;
if (Version.TryParse(versionValue, out var version))
{
return version;
}
}
return null;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With