使用Inno Setup 打包.NET程序,并自动安装.Net Framework

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还是小了不少.

在线安装的话安装包是小了,但是下载缺是比较耗时的。

 

参考资料:http://zerosandtheone.com/blogs/vb/archive/2008/06/23/vb-net-install-your-app-and-the-net-framework-using-inno-setup.aspx

http://my.hoopchina.com/114266/blog/24775.html

转载于:https://www.cnblogs.com/xiaogangqq123/archive/2012/03/19/2405730.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值