WixSharp🛠️
在使用前我们先了解一下什么是Wix和WixSharp是什么。
Wix(Windows Installer XML)
Wix 是一个开源的工具集,用于创建Windows安装程序包(MSI文件)。它使用XML文件来定义安装包的结构和内容。Wix提供了一系列命令行工具,用于编译和链接这些XML文件,从而生成一个可执行的Windows安装包。
Wix的主要特点包括:
开源和免费:Wix是一个完全开源的项目,任何人都可以免费使用。
灵活性:使用XML文件定义安装程序的结构,可以高度定制安装过程。
集成:Wix可以很好地集成到现有的开发工具链中,例如MSBuild、Visual Studio等。
强大的功能:支持复杂的安装场景,包括自定义操作、条件安装、升级、修补等。
WixSharp
WixSharp 是一个基于Wix的C#库,它使得使用C#代码来定义和生成Wix安装包成为可能。WixSharp简化了Wix的使用,提供了一种更加直观和易于使用的方式来创建安装程序,而无需手动编写XML文件。
WixSharp的主要特点包括:
简化的语法:使用C#代码而不是XML来定义安装包,使得开发人员可以利用熟悉的编程语言来编写安装逻辑。
强大的功能:尽管简化了语法,WixSharp仍然保留了Wix的强大功能,可以处理复杂的安装场景。
集成:可以轻松集成到C#项目中,并与Visual Studio无缝配合。
可扩展性:可以利用C#的强大功能来编写自定义操作和逻辑,扩展安装包的功能。
准备工作📝
Visual Studio (Rider 也可以)
Solidworks插件项目
安装WixSharp模板(可跳过,不建议)
WixSharp 项目本质是一个控制台项目,Visual Studio的模板可以提供很多预设,如果你对WixSharp比较熟悉,也可以从新建控制台项目开发,而不必要安装此扩展。
如果这里无法下载安装,可以访问此链接在网页下载完成后安装。
创建WixSharp项目🚀
新建一个
WixSharp Steup(Wix3)
的项目
项目名称命名为
Installer
编写安装包生成代码💻
internal class Program
{
const string ProductName = "SolidworksURDFExporter"; // 产品名称
const string CompanyName = "Ros"; // 公司名称
const string ProductId = "6B987FA1-EBB0-4C20-BA70-ED4B9A11B5A6"; // 产品ID
const string OutputDir = "output"; // 安装包生成路径
const string Manufacturer = "https://github.com/weianweigan/solidworks_urdf_exporter"; // 产品Url
const string HelpLink = "https://github.com/weianweigan/solidworks_urdf_exporter"; // 帮助连接
const string InstallationDir = $@"%ProgramFiles%\{CompanyName}\{ProductName}"; // 默认安装路径
static void Main()
{
string BinaryDir = GetBinDir(); // 打包的文件路径
Console.WriteLine($"Binary directory: {BinaryDir}");
string Version = GetVersion(); // 控制安装包版本
Console.WriteLine($"Version: {Version}");
string FileName = $"{ProductName}-{Version}";
var project = new Project(
ProductName,
new InstallDir(InstallationDir, GetWixEntities(BinaryDir)),
new ElevatedManagedAction(
CustomActions.InstallServer,
Return.check,
When.After,
Step.InstallFiles,
Condition.NOT_Installed
),
new ElevatedManagedAction(
CustomActions.UnInstallServer,
Return.check,
When.Before,
Step.RemoveFiles,
Condition.BeingUninstalled
)
)
{
OutDir = OutputDir,
Platform = Platform.x64,
UI = WUI.WixUI_InstallDir,
Version = new Version(Version),
OutFileName = FileName,
InstallScope = InstallScope.perMachine,
InstallPrivileges = InstallPrivileges.elevated,
MajorUpgrade = MajorUpgrade.Default,
GUID = new Guid(ProductId),
// BackgroundImage = @"Resources\Icons\BackgroundImage.png", // 图片需要把图片放置在此路径, 大小为494x312
// BannerImage = @"Resources\Icons\BannerImage.png", // 图片需要把图片放置在此路径, 大小为493x58
ControlPanelInfo =
{
Manufacturer = Manufacturer,
HelpLink = HelpLink,
Comments = ProductName,
// ProductIcon = @"Resources\Icons\ShellIcon.ico" // 图片需要把图片放置在此路径,控制面板图标
},
ValidateBackgroundImage = false,
};
project.RemoveDialogsBetween(NativeDialogs.WelcomeDlg, NativeDialogs.InstallDirDlg);
project.BuildMsi();
}
static string GetVersion() => typeof(Program).Assembly.GetName().Version.ToString();
static string GetBinDir()
{
var dir = Path.GetDirectoryName(typeof(Program).Assembly.Location);
while (!Directory.GetDirectories(dir).Any(p => p.EndsWith(".git")))
{
dir = Directory.GetParent(dir).FullName;
}
return Path.Combine(dir, "SW2URDF", "bin",
#if DEBUG
"Debug"
#else
"Release"
#endif
);
}
static WixEntity[] GetWixEntities(string binaryDir)
{
return
[
new Files($@"{binaryDir}\*.*"),
new Dir(
$@"%ProgramMenu%\{CompanyName}\{ProductName}",
new ExeFileShortcut(
$"UnInstall {ProductName}",
"[System64Folder]msiexec.exe",
$"/x [ProductCode]"
)
)
];
}
}
public class CustomActions
{
[CustomAction]
public static ActionResult InstallServer(Session session)
{
return session.HandleErrors(() =>
{
string batFile = Path.Combine(session.Property("INSTALLDIR"), "Install.bat");
var p = Process.Start(batFile);
p.WaitForExit();
});
}
[CustomAction]
public static ActionResult UnInstallServer(Session session)
{
return session.HandleErrors(() =>
{
string batFile = Path.Combine(session.Property("INSTALLDIR"), "UnInstall.bat");
var p = Process.Start(batFile);
p.WaitForExit();
});
}
}
这里用到了两个脚本文件 Install.bat
和 UnInstall.bat
来注册和卸载程序集,需要将这两个文件和RegAsm.exe这三个文件放置你的打包目录。
set path=%~d0
cd %path%
cd /d %~dp0
RegAsm.exe SW2URDF.dll /codebase
set path=%~d0
cd %path%
cd /d %~dp0
RegAsm.exe SW2URDF.dll /u
生成安装包📦
这时候,编译Installer项目就会生成安装包,如果不想编译就生成 <PackageReference Include="WixSharp.bin" Version="1.25.2" />
包卸载。
参考项目📚
可以参考一下项目创建你的安装包生成项目。
weianweigan/solidworks_urdf_exporter: SolidWorks to URDF Exporter (github.com)