您的位置:首页 > 其它

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

2017-11-17 09:32 507 查看
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到安装包方式脚本:

[vb] view
plain copy

; 脚本由 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

[vb] view
plain copy

; 脚本由 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还是小了不少.

在线安装的话安装包是小了,但是下载缺是比较耗时的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐