WixSharp打包教程

一、安装WixSharp项目模板

点击VisualStudio-扩展-管理扩展,搜索“WixSaharp”,安装“WixSharp Project Templates”。如下图所示:

image

二、添加WixSharp打包项目

1、右键解决方案,点击添加-新建项目

image

2、在弹出的添加新项目模板选择里面,搜索“wix”,找到“WixSharp Managed Setup”项目模板,点击下一步。

image

3、点击右下角“创建”创建项目

image

4、点击“Program.cs”进入打包程序文件。

image

5、解决方案构成如下:

image

三、安装包配置

1、安装路径及打包配置

1.1、单文件打包

1
2
//打包单个EXE文件
var project = new ManagedProject("软件名称",new Dir($@"%ProgramFiles%\制造商名称\软件名称",new File(@"..\WpfApp1\bin\Debug\WpfApp1.exe")));

ManagedProject后面填写软件的名称,Dir后面填写安装路径,File后面填写需要打包的文件。其中“..\”的意思为返回上一级目录。

1.2、多文件打包

1
2
//打包Debug目录下的所有文件
var project = new ManagedProject("软件名称",new Dir($@"%ProgramFiles%\制造商名称\软件名称",new Files(@"..\WpfApp1\bin\Debug\*.*")));

打包多个文件,由File变为Files,字符串格式以”*.*“结尾,意为匹配所有文件。

1.3、创建桌面图标

1
2
//打包多个文件并创建桌面快捷方式
var project = new ManagedProject("软件名称", new Dir($@"%ProgramFiles%\制造商名称\软件名称", new Files(@"..\WpfApp1\bin\Debug\*.*", f => !f.EndsWith("WpfApp1.exe")), new File(@"..\WpfApp1\bin\Debug\WpfApp1.exe", new FileShortcut("软件名称", @"%Desktop%"))));

先创建Files实例,将除了需要创建桌面快捷方式的文件进行打包,再创建单个File实例,打包EXE文件,并创建快捷方式。其中”f => !f.EndsWith(“WpfApp1.exe”)“是用于过滤出指定EXE文件。

File中传入”new FileShortcut(“软件名称”, @”%Desktop%”)“进行桌面快捷方式创建,”@”%Desktop%”“为相对的桌面地址。

1.4、根据不同功能安装不同文件到不同位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 //依据功能选项安装不同文件
//创建不同功能选项
var revit2018 = new Feature("Revit2018", "Revit2018的功能描述") { IsEnabled = false };
var revit2019 = new Feature("Revit2019", "Revit2019的功能描述") { IsEnabled = false };
var revit2020 = new Feature("Revit2020", "Revit2020的功能描述") { IsEnabled = false };
//安装路径及文件配置
var project = new ManagedProject("软件名称", new WixEntity[]
{
new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2018", new WixEntity[] { new Files(revit2018, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2018, @"..\WpfApp1\Ribbon2018.addin") }),
new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2019", new WixEntity[] { new Files(revit2019, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2019, @"..\WpfApp1\Ribbon2019.addin") }),
new Dir(@"C:\Users\Administrator\Desktop\新建文件夹", new WixEntity[] { new Files(revit2020, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2020, @"..\WpfApp1\Ribbon2020.addin") })
});
//设置默认功能
project.DefaultFeature = revit2018;

以上代码设置了三个功能选项,分别为”Revit2018”,”Revit2019”,”Revit2020“,IsEnabled属性设置为false后,在功能选项下,其默认为不勾选状态。如下图所示:

Dir后面的”2018“参数指的是当勾选,Revit2018功能后,软件会安装在”C:\ProgramData\Autodesk\Revit\Addins\2018“目录下。Files及File后面的”revit2018“是表示该文件归属revit2018功能。

project.DefaultFeature = revit2018,必须设置,如不进行默认功能设置,在功能选项卡则会生成Complete选项。

image

2、安装包名称设置

1
2
//MSI包名称
roject.OutFileName = "软件名称" + $"{DateTime.Now.Year}{DateTime.Now.Month:00}{DateTime.Now.Day:00}{DateTime.Now.Hour:00}{DateTime.Now.Minute:00}";

生成的包名效果如下:

image

3、安装包输出路径设置

1
2
//MSI文件输出文件夹
project.OutDir = @"..\";

表示生成在Pregram.cs文件的上级目录即”WixSharpSample“文件夹下

image

4、安装包UI元素设置

1
2
3
4
//设置自定义图片
project.ValidateBackgroundImage = false;//关闭背景图片大小验证
project.BackgroundImage = "BackgroundImage-CAD.png";//建议宽度156,高度312
project.BannerImage = "BannerImage-CAD.png";

关闭背景图片大小验证后,当设置非156*312的图片时,会自动调整布局。否则非156*312图片设置会报错。

BackgroundImage对应下图:

image

BannerImage对应下图:

image

5、控制面板信息设置

1
2
3
4
//设置控制面板制造商名称
project.ControlPanelInfo.Manufacturer = "DigitalStruct Studio";
//设置控制面板图标
project.ControlPanelInfo.ProductIcon = "ShellIcon-CAD.ico";

控制面板信息会在软件安装后在控制面板显示。效果如下:

image

6、设置可覆盖安装

1
2
3
4
5
6
7
8
9
//安装新版本时自动卸载旧版本
project.UpgradeCode = new Guid("511EED44-E344-4821-BF25-B42175CE41AC");
project.MajorUpgrade = new MajorUpgrade
{
AllowSameVersionUpgrades = true,
DowngradeErrorMessage = "当前安装的版本低于已安装的版,无法再次安装。",
AllowDowngrades = false,
chedule = UpgradeSchedule.afterInstallValidate
};

通过设置以上代码实现软件安装时自动覆盖安装,无需卸载。

7、设置安装包语言

1
2
3
//加载和设置中文配置文件
project.Language = "zh-CN";
project.LocalizationFile = "WixUI_zh-CN.wxl";

需要手动载入”WixUI_zh-CN.wxl”中文配置文件,不然配置project.Language = “zh-CN”不会生效。

8、设置用户协议

1
2
//设置用户协议文件
project.LicenceFile = "用户协议-CAD.rtf";

用户协议必须为.rtf文件格式。

9、对话框配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//设置对话框
project.ManagedUI = new ManagedUI();
project.ManagedUI.Icon = "ShellIcon-CAD.ico";
project.ManagedUI.InstallDialogs.Add(Dialogs.Welcome)
.Add(Dialogs.Licence)
.Add(Dialogs.SetupType)
.Add(Dialogs.Features)
.Add(Dialogs.InstallDir)
.Add(Dialogs.Progress)
.Add(Dialogs.Exit);

project.ManagedUI.ModifyDialogs.Add(Dialogs.MaintenanceType)
.Add(Dialogs.Features)
.Add(Dialogs.Progress)
.Add(Dialogs.Exit);

project.ManagedUI.Icon = “ShellIcon-CAD.ico”为设置左上角图标。

image

9.1安装对话框

Welcome对话框

image

Licence对话框

image

SetupType对话框

image

当选择典型时,会根据project.DefaultFeature = revit2018设置的默认功能进行安装。自定义则进行自定义安装。完整则全部安装。

Features对话框

image

InstallDir对话框

image

Progress对话框

image

Exit对话框

image

9.2卸载对话框

MaintenanceType对话框

image

Features对话框

image

Progress对话框

image

Exit对话框

10、完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Windows.Forms;
using WixSharp;
using WixSharp.Forms;

namespace WixSharp_Setup1
{
internal class Program
{
static void Main()
{
//打包单个EXE文件
//var project = new ManagedProject("软件名称",
// new Dir($@"%ProgramFiles%\制造商名称\软件名称",
// new File(@"..\WpfApp1\bin\Debug\WpfApp1.exe")));


//打包Debug目录下的所有文件
//var project = new ManagedProject("软件名称",
// new Dir($@"%ProgramFiles%\制造商名称\软件名称",
// new Files(@"..\WpfApp1\bin\Debug\*.*")));


//打包多个文件并创建桌面快捷方式
//var project = new ManagedProject("软件名称",
// new Dir($@"%ProgramFiles%\制造商名称\软件名称",
// new Files(@"..\WpfApp1\bin\Debug\*.*", f => !f.EndsWith("WpfApp1.exe")),
// new File(@"..\WpfApp1\bin\Debug\WpfApp1.exe", new FileShortcut("软件名称", @"%Desktop%"))));


////依据功能选项安装不同文件
////创建不同功能选项
//var revit2018 = new Feature("Revit2018", "Revit2018的功能描述") { IsEnabled = false };
//var revit2019 = new Feature("Revit2019", "Revit2019的功能描述") { IsEnabled = false };
//var revit2020 = new Feature("Revit2020", "Revit2020的功能描述") { IsEnabled = false };
////安装路径及文件配置
//var project = new ManagedProject("软件名称",
// new Dir(@"C:\ProgramData\Autodesk\Revit\Addins",
// new Dir("2018", new WixEntity[] { new Files(revit2018, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2018, @"..\WpfApp1\Ribbon2018.addin") }),
// new Dir("2019", new WixEntity[] { new Files(revit2019, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2019, @"..\WpfApp1\Ribbon2019.addin") }),
// new Dir("2020", new WixEntity[] { new Files(revit2020, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2020, @"..\WpfApp1\Ribbon2020.addin") })));
////设置默认功能
//project.DefaultFeature = revit2018;

//依据功能选项安装不同文件
//创建不同功能选项
var revit2018 = new Feature("Revit2018", "Revit2018的功能描述") { IsEnabled = false };
var revit2019 = new Feature("Revit2019", "Revit2019的功能描述") { IsEnabled = false };
var revit2020 = new Feature("Revit2020", "Revit2020的功能描述") { IsEnabled = false };
//安装路径及文件配置
var project = new ManagedProject("软件名称", new WixEntity[]
{
new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2018", new WixEntity[] { new Files(revit2018, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2018, @"..\WpfApp1\Ribbon2018.addin") }),
new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2019", new WixEntity[] { new Files(revit2019, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2019, @"..\WpfApp1\Ribbon2019.addin") }),
new Dir(@"C:\Users\Administrator\Desktop\新建文件夹", new WixEntity[] { new Files(revit2020, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2020, @"..\WpfApp1\Ribbon2020.addin") })
});
//设置默认功能
project.DefaultFeature = revit2018;

//MSI包名称
project.OutFileName = "软件名称" + $"{DateTime.Now.Year}{DateTime.Now.Month:00}{DateTime.Now.Day:00}{DateTime.Now.Hour:00}{DateTime.Now.Minute:00}";

//MSI文件输出文件夹
project.OutDir = @"..\";

//设置自定义图片
project.ValidateBackgroundImage = false;//关闭背景图片大小验证
project.BackgroundImage = "BackgroundImage-CAD.png";//建议宽度156,高度312
project.BannerImage = "BannerImage-CAD.png";

//设置控制面板制造商名称
project.ControlPanelInfo.Manufacturer = "DigitalStruct Studio";
//设置控制面板图标
project.ControlPanelInfo.ProductIcon = "ShellIcon-CAD.ico";

//安装新版本时自动卸载旧版本
project.UpgradeCode = new Guid("511EED44-E344-4821-BF25-B42175CE41AC");
project.MajorUpgrade = new MajorUpgrade
{
AllowSameVersionUpgrades = true,
DowngradeErrorMessage = "当前安装的版本低于已安装的版,无法再次安装。",
AllowDowngrades = false,
Schedule = UpgradeSchedule.afterInstallValidate
};

//加载和设置中文配置文件
project.Language = "zh-CN";
project.LocalizationFile = "WixUI_zh-CN.wxl";

//设置用户协议文件
project.LicenceFile = "用户协议-CAD.rtf";

//设置对话框
project.ManagedUI = new ManagedUI();
project.ManagedUI.Icon = "ShellIcon-CAD.ico";
project.ManagedUI.InstallDialogs.Add(Dialogs.Welcome)
.Add(Dialogs.Licence)
.Add(Dialogs.SetupType)
.Add(Dialogs.Features)
.Add(Dialogs.InstallDir)
.Add(Dialogs.Progress)
.Add(Dialogs.Exit);

project.ManagedUI.ModifyDialogs.Add(Dialogs.MaintenanceType)
.Add(Dialogs.Features)
.Add(Dialogs.Progress)
.Add(Dialogs.Exit);

project.Load += Msi_Load;
project.BeforeInstall += Msi_BeforeInstall;
project.AfterInstall += Msi_AfterInstall;

project.BuildMsi();
}

static void Msi_Load(SetupEventArgs e)
{
if (!e.IsUISupressed && !e.IsUninstalling)
MessageBox.Show(e.ToString(), "Load");
}

static void Msi_BeforeInstall(SetupEventArgs e)
{
if (!e.IsUISupressed && !e.IsUninstalling)
MessageBox.Show(e.ToString(), "BeforeInstall");
}

static void Msi_AfterInstall(SetupEventArgs e)
{
if (!e.IsUISupressed && !e.IsUninstalling)
MessageBox.Show(e.ToString(), "AfterExecute");
}
}
}