forked from LANraragi/Karen
149 lines
6.8 KiB
C#
149 lines
6.8 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using Microsoft.Deployment.WindowsInstaller;
|
|
using WixSharp;
|
|
using WixSharp.CommonTasks;
|
|
using WixSharp.Controls;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using File = WixSharp.File;
|
|
|
|
namespace Setup
|
|
{
|
|
public class Program
|
|
{
|
|
static void Main()
|
|
{
|
|
// This project type has been superseded with the EmbeddedUI based "WixSharp Managed Setup - Custom Dialog"
|
|
// project type. Which provides by far better final result and user experience.
|
|
// However due to the Burn limitations (see this discussion: https://wixsharp.codeplex.com/discussions/645838)
|
|
// currently "Custom CLR Dialog" is the only working option for having bootstrapper silent UI displaying
|
|
// individual MSI packages UI implemented in managed code.
|
|
|
|
var uninstallerShortcut = new ExeFileShortcut("Uninstall LANraragi", "[System64Folder]msiexec.exe", "/x [ProductCode]");
|
|
|
|
var registerAction = new ManagedAction(RegisterWslDistro,
|
|
Return.check,
|
|
When.After,
|
|
Step.InstallFinalize,
|
|
Condition.NOT_BeingRemoved);
|
|
registerAction.ProgressText = "Installing the LANraragi WSL Distro... (This will show a cmd window)";
|
|
|
|
var unregisterAction = new ManagedAction(UnRegisterWslDistro,
|
|
Return.check,
|
|
When.Before,
|
|
Step.RemoveFiles,
|
|
Condition.BeingUninstalled);
|
|
unregisterAction.ProgressText = "Removing the previous LANraragi WSL Distro (This will show a cmd window)";
|
|
|
|
var project = new Project("LANraragi",
|
|
new Dir(@"%AppData%\LANraragi",
|
|
new Files(@"..\Karen\bin\Release\net472\win7-x64\*.*"),
|
|
new File(@"..\DistroInstaller\bin\Release\net472\win7-x64\DistroInstaller.exe"), //DesktopBridge.Helpers.dll already in the global Files match above
|
|
new File(@"..\External\package.tar"),
|
|
uninstallerShortcut
|
|
),
|
|
new Dir(@"%ProgramMenu%\LANraragi for Windows",
|
|
new ExeFileShortcut("LANraragi", "[INSTALLDIR]Karen.exe", "")),
|
|
new RegValue(RegistryHive.LocalMachineOrUsers, @"Software\Microsoft\Windows\CurrentVersion\Run", "Karen", "[INSTALLDIR]Karen.exe"),
|
|
registerAction,
|
|
unregisterAction
|
|
);
|
|
|
|
project.GUID = new Guid("6fe30b47-2577-43ad-1337-1861ba25889b");
|
|
project.Platform = Platform.x64;
|
|
project.MajorUpgrade = new MajorUpgrade
|
|
{
|
|
Schedule = UpgradeSchedule.afterInstallValidate, // Remove previous version entirely before reinstalling, so that the WSL distro isn't uninstalled on upgrade.
|
|
DowngradeErrorMessage = "A later version of [ProductName] is already installed. Setup will now exit."
|
|
};
|
|
|
|
// Version number is based on the LRR_VERSION_NUM env variable
|
|
var version = "0.0.1";
|
|
if (Environment.GetEnvironmentVariable("LRR_VERSION_NUM") != null)
|
|
version = Environment.GetEnvironmentVariable("LRR_VERSION_NUM");
|
|
|
|
try
|
|
{
|
|
project.Version = Version.Parse(version);
|
|
}
|
|
catch
|
|
{
|
|
Console.WriteLine("Couldn't get version from the environment variable " + version);
|
|
project.Version = Version.Parse("0.0.1");
|
|
}
|
|
|
|
// Check for x64 Windows 10
|
|
project.LaunchConditions.Add(new LaunchCondition("VersionNT64", "LANraragi for Windows can only be installed on a 64-bit Windows."));
|
|
project.LaunchConditions.Add(new LaunchCondition("VersionNT>=\"603\"", "LANraragi for Windows can only be installed on Windows 10 and up."));
|
|
|
|
//Schedule custom dialog between WelcomeDlg and InstallDirDlg standard MSI dialogs.
|
|
project.InjectClrDialog(nameof(ShowDialogIfWslDisabled), NativeDialogs.WelcomeDlg, NativeDialogs.InstallDirDlg);
|
|
|
|
//remove LicenceDlg
|
|
project.RemoveDialogsBetween(NativeDialogs.InstallDirDlg, NativeDialogs.VerifyReadyDlg);
|
|
|
|
// Customize
|
|
project.BackgroundImage = @"Images\dlgbmp.bmp";
|
|
project.BannerImage = @"Images\bannrbmp.bmp";
|
|
|
|
project.ControlPanelInfo.UrlInfoAbout = "https://github.com/Difegue/LANraragi";
|
|
project.ControlPanelInfo.UrlUpdateInfo = "https://sugoi.gitbook.io/lanraragi/";
|
|
project.ControlPanelInfo.ProductIcon = @"Images\favicon.ico";
|
|
project.ControlPanelInfo.Contact = "Difegue";
|
|
project.ControlPanelInfo.Manufacturer = "Difegue";
|
|
|
|
project.OutDir = "bin";
|
|
project.BuildMsi();
|
|
}
|
|
|
|
[CustomAction]
|
|
public static ActionResult RegisterWslDistro(Session session)
|
|
{
|
|
#if DEBUG
|
|
Debugger.Launch();
|
|
#endif
|
|
if (session.IsUninstalling())
|
|
{
|
|
return UnRegisterWslDistro(session);
|
|
}
|
|
|
|
var packageLocation = session.Property("INSTALLDIR") + @"package.tar";
|
|
var distroInstaller = session.Property("INSTALLDIR") + @"DistroInstaller.exe";
|
|
|
|
return session.HandleErrors(() =>
|
|
{
|
|
// Use distroinstaller to either install or uninstall the WSL distro.
|
|
session.Log("Installing WSL Distro from package.tar");
|
|
session.Log($"DistroInstaller location: {distroInstaller}");
|
|
session.Log($"package.tar location: {packageLocation}");
|
|
|
|
var wslProc = Process.Start(distroInstaller, $"-upgrade \"{packageLocation}\"");
|
|
wslProc.WaitForExit();
|
|
|
|
session.Log("Exit code of DistroInstaller is " + wslProc.ExitCode);
|
|
});
|
|
}
|
|
|
|
[CustomAction]
|
|
public static ActionResult UnRegisterWslDistro(Session session)
|
|
{
|
|
// We don't use distroInstaller here since INSTALLDIR isn't set when uninstalling.
|
|
return session.HandleErrors(() =>
|
|
{
|
|
session.Log("Removing previous WSL Distro");
|
|
var wslProc = Process.Start("wslconfig.exe", "/unregister lanraragi");
|
|
wslProc.WaitForExit();
|
|
});
|
|
}
|
|
|
|
[CustomAction]
|
|
public static ActionResult ShowDialogIfWslDisabled(Session session)
|
|
{
|
|
return WixCLRDialog.ShowAsMsiDialog(new WslCheckDialog(session));
|
|
}
|
|
|
|
}
|
|
}
|