Inno Setup是什么
Inno Setup 是一个windows系统下的安装包制作程序。它是免费的(而且允许免费用于商业用途)。官网网站:http://www.jrsoftware.org/
虽然说.NET 可以使用VS来打包安装包,但可定制化绝对不如Inno Setup,基本的使用这里不做过多介绍。大家Google一下吧。
我们在开发.net客户端时候.Net Framework是个比较让人头疼的问题,比如一个WPF程序大小几百K,却要安装一个几十M的.Net Framework。但是也没办法.这里提供两种方式,一个是将.Net Framework打包进安装包中,一个是在线下载.Net Framework然后安装。
各有各的缺点和优点。大家自己择优选择吧。
Inno Setup打包.Net Framework到安装包方式脚本:
; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
#define
MyAppName "MyApp"
#define
MyAppVersion "1.0"
#define
IncludeFramework true
#define
IsExternal ""
#define
MyAppPublisher "App"
#define
MyAppURL "http:
//
www.MyApp.cn"
#define
MyAppExeName "MyApp.exe"
[Setup] ; 注: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; (生成新的GUID,点击 工具
|
在IDE中生成GUID。) AppId
=
{{B0C52F2E
-
939F
-
4CE2
-
89F3
-
2F0677584526} AppName
=
{#MyAppName} AppVersion
=
{#MyAppVersion} ;AppVerName
=
{#MyAppName} {#MyAppVersion} AppPublisher
=
{#MyAppPublisher} AppPublisherURL
=
{#MyAppURL} AppSupportURL
=
{#MyAppURL} AppUpdatesURL
=
{#MyAppURL} DefaultDirName
=
{pf}\{#MyAppName} DefaultGroupName
=
{#MyAppName} OutputDir
=
E:\step Compression
=
lzma SolidCompression
=
yes
#if
IncludeFramework
OutputBaseFilename
=
setup_FW
#else
OutputBaseFilename
=
Setup
#endif
[Languages] Name:
"
chinesesimp
"
; MessagesFile:
"
compiler:Default.isl
"
[Tasks] Name:
"
desktopicon
"
; Description:
"
{cm:CreateDesktopIcon}
"
; GroupDescription:
"
{cm:AdditionalIcons}
"
; Flags:
unchecked
; OnlyBelowVersion:
0
,
6.1
[Files] Source:
"
E:\MyApp\MyApp.exe
"
; DestDir:
"
{app}
"
; Flags: ignoreversion {#IsExternal}
#if
IncludeFramework
Source:
"
D:\开发\dotNetFx40_Full_x86_x64.exe
"
; DestDir:
"
{tmp}
"
; Flags: ignoreversion {#IsExternal}; Check: NeedsFramework
#endif
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion” [Icons] Name:
"
{group}\{#MyAppName}
"
; Filename:
"
{app}\{#MyAppExeName}
"
Name:
"
{commondesktop}\{#MyAppName}
"
; Filename:
"
{app}\{#MyAppExeName}
"
; Tasks: desktopicon [Run]
#if
IncludeFramework
Filename: {tmp}\dotNetFx40_Full_x86_x64.exe; Parameters:
"
/q:a /c:
""
install /l /q
"""
; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg:
"
Installing .NET Framework if needed
"
#endif
Filename: {win}\Microsoft.NET\Framework\v4.
0.30319
\CasPol.exe; Parameters:
"
-q -machine -remgroup
""
{#MyAppName}
"""
; WorkingDir: {tmp}; Flags: skipifdoesntexist runhidden; StatusMsg:
"
Setting Program Access Permissions...
"
Filename: {win}\Microsoft.NET\Framework\v4.
0.30319
\CasPol.exe; Parameters:
"
-q -machine -addgroup 1.2 -url
""
file://{app}/*
""
FullTrust -name
""
{#MyAppName}
"""
; WorkingDir: {tmp}; Flags: skipifdoesntexist runhidden; StatusMsg:
"
Setting Program Access Permissions...
"
[UninstallRun] Filename: {win}\Microsoft.NET\Framework\v4.
0.30319
\CasPol.exe; Parameters:
"
-q -machine -remgroup
""
{#MyAppName}
"""
; Flags: skipifdoesntexist runhidden; [code]
//
Indicates whether .NET Framework 2.0 is installed.
function IsDotNET40Detected(): boolean; var success: boolean; install: cardinal; begin success :
=
RegQueryDWordValue(HKLM,
'
SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
'
,
'
Install
'
, install);
//
success := RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727', 'Install', install);
Result :
=
success and (install
=
1
); end;
//
RETURNS OPPOSITE OF IsDotNet20Detected FUNCTION
//
Remember this method from the Files section above
function NeedsFramework(): Boolean; begin Result :
=
(IsDotNET40Detected
=
false
); end; function GetCustomSetupExitCode(): Integer; begin
if
(IsDotNET40Detected
=
false
) then begin MsgBox(
'
.NET Framework 未能正确安装!
'
,mbError, MB_OK); result :
=
-
1
end end;
//
卸载程序
function InitializeUninstall(): Boolean; begin Result :
=
MsgBox(
'
卸载程序:
'
#
13
#
13
'
你真的要卸载该程序?
'
, mbConfirmation, MB_YESNO)
=
idYes;
//
if Result = False then
//
MsgBox('InitializeUninstall:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var ErrorCode: Integer; begin
case
CurUninstallStep of usUninstall: begin
//
MsgBox('卸载程序:' #13#13 '正在卸载...', mbInformation, MB_OK)
//
...insert code to perform pre-uninstall tasks here...
end; usPostUninstall: begin
//
MsgBox('卸载程序:' #13#13 '卸载完成.', mbInformation, MB_OK);
//
...insert code to perform post-uninstall tasks here...
ShellExec(
'
open
'
,
'
http://www.asiafinance.cn
'
,
''
,
''
, SW_SHOW, ewNoWait, ErrorCode) end; end; end;
脚本说明:
卸载完成之后会自动打开网页,其中的逻辑可以在里面自由扩展。
检测哪个Framwork可以在注册表中找到这个节点。
Inno Setup在线下载并安装.NetFramwork
; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
#define
MyAppName "MyApp"
#define
MyAppVersion "1.0"
#define
MyAppPublisher "MyApp"
#define
MyAppURL "http:
//
www.MyApp.cn/"
#define
MyAppExeName "MyApp.exe"
[Setup] ; 注: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; (生成新的GUID,点击 工具
|
在IDE中生成GUID。) AppId
=
{{769CC8AC
-
50C3
-
4776
-
95F5
-
A1ABF15A38F4} AppName
=
{#MyAppName} AppVersion
=
{#MyAppVersion} ;AppVerName
=
{#MyAppName} {#MyAppVersion} AppPublisher
=
{#MyAppPublisher} AppPublisherURL
=
{#MyAppURL} AppSupportURL
=
{#MyAppURL} AppUpdatesURL
=
{#MyAppURL} DefaultDirName
=
{pf}\{#MyAppName} DefaultGroupName
=
{#MyAppName} OutputDir
=
E:\step OutputBaseFilename
=
MyApp Compression
=
lzma SolidCompression
=
yes [Languages] Name:
"
chinesesimp
"
; MessagesFile:
"
compiler:Default.isl
"
[Tasks] Name:
"
desktopicon
"
; Description:
"
{cm:CreateDesktopIcon}
"
; GroupDescription:
"
{cm:AdditionalIcons}
"
; Flags:
unchecked
; OnlyBelowVersion:
0
,
6.1
[Files] Source: C:\Program Files\ISTool\isxdl.dll; Flags: dontcopy ; Source:
"
E:\MyApp\MyApp.exe
"
; DestDir:
"
{app}
"
; Flags: ignoreversion ; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion” [Icons] Name:
"
{group}\{#MyAppName}
"
; Filename:
"
{app}\{#MyAppExeName}
"
Name:
"
{group}\{cm:UninstallProgram,{#MyAppName}}
"
; Filename:
"
{uninstallexe}
"
Name:
"
{commondesktop}\{#MyAppName}
"
; Filename:
"
{app}\{#MyAppExeName}
"
; Tasks: desktopicon [Run] Filename:
"
{app}\{#MyAppExeName}
"
; Description:
"
{cm:LaunchProgram,{#StringChange(MyAppName,
"
&
"
,
"
&&
"
)}}
"
; Flags: nowait postinstall skipifsilent [Code] var dotnetRedistPath:
string
; downloadNeeded: boolean; dotNetNeeded: boolean; memoDependenciesNeeded:
string
; procedure isxdl_AddFile(URL, Filename: PChar); external
'
isxdl_AddFile@files:isxdl.dll stdcall
'
; function isxdl_DownloadFiles(hWnd: Integer): Integer; external
'
isxdl_DownloadFiles@files:isxdl.dll stdcall
'
; function isxdl_SetOption(Option, Value: PChar): Integer; external
'
isxdl_SetOption@files:isxdl.dll stdcall
'
;
const
dotnetRedistURL
=
'
http://www.microsoft.com/downloads/info.aspx?na=41&srcfamilyid=e5ad0459-cbcc-4b4f-97b6-fb17111cf544&srcdisplaylang=en&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f6%2f2%2f562A10F9-C9F4-4313-A044-9C94E0A8FAC8%2fdotNetFx40_Client_x86_x64.exe
'
;
//
this url was correct at time of publication for .net 3.5 you may need to change this in future.
//
local system for testing…
//
dotnetRedistURL = ‘
http://192.168.1.1/dotnetfx35.exe
’;
function InitializeSetup(): Boolean; begin Result :
=
true
; dotNetNeeded :
=
false
;
//
Check for required netfx installation
if
(not RegKeyExists(HKLM,
'
Software\Microsoft\.NETFramework\policy\v4.0
'
)) then begin dotNetNeeded :
=
true
;
if
(not IsAdminLoggedOn()) then begin MsgBox(
'
GasSoft needs the Microsoft .NET Framework to be installed by an Administrator
'
, mbInformation, MB_OK); Result :
=
false
; end
else
begin memoDependenciesNeeded :
=
memoDependenciesNeeded
+
'
.NET Framework
'
#
13
; dotnetRedistPath :
=
ExpandConstant(
'
{src}\dotnetfx35.exe
'
);
if
not FileExists(dotnetRedistPath) then begin dotnetRedistPath :
=
ExpandConstant(
'
{tmp}\dotnetfx35.exe
'
);
if
not FileExists(dotnetRedistPath) then begin isxdl_AddFile(dotnetRedistURL, dotnetRedistPath); downloadNeeded :
=
true
; end; end; SetIniString(
'
install
'
,
'
dotnetRedist
'
, dotnetRedistPath, ExpandConstant(
'
{tmp}\dep.ini
'
)); end; end; end; function NextButtonClick(CurPage: Integer): Boolean; var hWnd: Integer; ResultCode: Integer; begin Result :
=
true
;
if
CurPage
=
wpReady then begin
if
(not RegKeyExists(HKLM,
'
Software\Microsoft\.NETFramework\policy\v4.0
'
)) then begin hWnd :
=
StrToInt(ExpandConstant(
'
{wizardhwnd}
'
));
//
don’t try to init isxdl if it’s not needed because it will error on < ie 3
if
downloadNeeded then begin isxdl_SetOption(
'
label
'
,
'
正在下载 Microsoft .NET Framework
'
); isxdl_SetOption(
'
des-c-r-i-p-tion
'
,
'
您还未安装Microsoft .NET Framework. 请您耐心等待,下载完成后会安装到您的的计算机中。
'
);
if
isxdl_DownloadFiles(hWnd)
=
0
then Result :
=
false
; end;
if
(Result
=
true
) and (dotNetNeeded
=
true
) then begin
if
Exec(ExpandConstant(dotnetRedistPath),
'
/qb
'
,
''
, SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin
//
handle success if necessary; ResultCode contains the exit code
if
not (ResultCode
=
0
) then begin Result :
=
false
; end; end
else
begin
//
handle failure if necessary; ResultCode contains the error code
Result :
=
false
; end; end; end; end; end;
我检测是.Net Framework4.0,安装包大小大概48M,相比3.0还是小了不少.
在线安装的话安装包是小了,但是下载缺是比较耗时的。