使用Inno Setup制作专业级Windows安装包
一.Inno Setup
Inno Setup 是一个免费的 Windows 程序安装包制作工具,它允许开发者创建专业级的安装程序。使用 Inno Setup,您可以为您的应用程序定义安装和卸载过程,包括文件复制、快捷方式创建、注册表修改等操作。
1.1安装
从官网下载Inno Setup软件,地址:https://files.jrsoftware.org/is/6/
1.2增加简体中文安装语言
进入InnoSetup根目录下的Languages文件夹,创建文件Chinese.isl。内容为以下文本,内容来源打开地址https://jrsoftware.org/files/istrans/。然后制作安装包的时候,就可以选中简体中文语言了。
二.使用C#编写主可执行文件
using System;
using System.Diagnostics;
using System.IO;
class Program
{
static void Main(string[] args)
{
string htmlFilePath = @"C:\Meeting\无纸化会议系统.html";
if (File.Exists(htmlFilePath))
{
OpenFile(htmlFilePath);
}
else
{
Console.WriteLine($"{htmlFilePath} 文件不存在。");
}
}
static void OpenFile(string filePath)
{
try
{
// 使用Process.Start直接打开文件,系统会根据文件类型调用相应的程序,默认是浏览器对于HTML文件
Process.Start(new ProcessStartInfo(filePath) { UseShellExecute = true });
}
catch (Exception ex)
{
Console.WriteLine($"无法打开文件: {ex.Message}");
}
}
}
三.制作安装包
1.新建打包项目
2.点击下一步
3.填写软件名称、软件版本、发行公司信息、软件地址
4.设置应用程序根目录和应用程序目录名
5.配置应用程序主可执行文件,添加需要打包的文件
6.配置应用程序文件关联,点击下一步
7.配置应用程序快捷方式,默认选中
- 在“开始”菜单程序文件夹中创建主可执行文件的快捷方式
- 允许用户创建桌面快捷方式
8.应用程序文档,配置许可文件、安装之前显示的信息文件、安装之后显示的信息文件。
9.安装模式设置,默认选中
- 管理员安装模式(为所有用户安装)
10.应用程序注册表键和值,点击下一步。
11.安装程序语言,选中English和Chinese。
12.编译器设置,配置编译后安装包的输出文件夹位置、输出文件名、自定义安装程序图标。
13.点击下一步
14.完成
15.是否立即编译新的脚本。
16.是否保存script脚本信息。
17.等待编译完成。
18.安装编译好的软件,安装成功后效果如下。
四.进阶功能
4.1生成多个桌面快捷方式
在.iss
脚本文件的[Icons]
部分,可以通过以下方式添加多个快捷方式。 这里的Tasks: desktopicon
意味着只有当用户选择了创建桌面快捷方式的任务时,这些快捷方式才会被创建。
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{autodesktop}\Video_Server"; Filename: "{app}\Socket\Video_Server.exe"; Tasks: desktopicon
4.2执行脚本和exe程序
在 [Setup] 段中设置 PrivilegesRequired=admin,确保整个安装过程以管理员权限运行
[Setup]
...
PrivilegesRequired=admin
...
由于[Run]部分中的条目通常是在安装完成之后执行的,我们需要使用[Code]段来实现更灵活的控制流。
[Run]
...
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode: Integer;
begin
if CurStep = ssPostInstall then
begin
// 执行 install.bat 脚本(需要管理员权限)
if not Exec(ExpandConstant('{app}\install.bat'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
MsgBox('Failed to execute install.bat', mbError, MB_OK);
end;
// 使用ShellExec以当前用户权限执行MachineControl.exe
if FileExists(ExpandConstant('{app}\SerialPort\MachineControl.exe')) then
begin
if not ShellExec('open', ExpandConstant('{app}\SerialPort\MachineControl.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then
begin
MsgBox('Failed to execute MachineControl.exe', mbError, MB_OK);
end;
end else
begin
MsgBox('MachineControl.exe not found', mbError, MB_OK);
end;
// 使用ShellExec以当前用户权限执行网络开关机控制程序.exe
if FileExists(ExpandConstant('{app}\网络开关机控制程序2.0.0\网络开关机控制程序.exe')) then
begin
if not ShellExec('open', ExpandConstant('{app}\网络开关机控制程序2.0.0\网络开关机控制程序.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then
begin
MsgBox('Failed to execute 网络开关机控制程序.exe', mbError, MB_OK);
end;
end else
begin
MsgBox('网络开关机控制程序.exe not found', mbError, MB_OK);
end;
end;
end;
4.3开机启动指定程序
利用[Registry]
段落来设置注册表键值,实现指定程序的开机启动。Windows操作系统会在每次启动时检查特定的注册表位置,以确定哪些应用程序需要自动启动。
[Registry]
; 设置start.bat为开机启动
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "startBat"; ValueData: """{app}\start.bat"""; Flags: uninsdeletevalue
; 设置MachineControl.exe为开机启动
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "MachineControlExe"; ValueData: """{app}\SerialPort\MachineControl.exe"""; Flags: uninsdeletevalue
; 设置网络开关机控制程序.exe为开机启动
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "网络开关机控制程序Exe"; ValueData: """{app}\网络开关机控制程序2.0.0\网络开关机控制程序.exe"""; Flags: uninsdeletevalue
- 本文标签: C#
- 本文链接: https://lanzi.cyou/article/42
- 版权声明: 本文由咖啡豆原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权