用Inno Setup来解决.NetFramework安装问题 2010-03-01 09:59:26

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhoufoxcn.blog.51cto.com/792419/279243
前段时间朋友接了一个项目,具体是开发一个安装在局域网内的软件,这个软件会定时连接局域网内的服务器来更新本地客户端的一些信息,因为在局域网内存在着多种不同的Windows版本,从WindowsXP、Windows2003及Windows2008到Windows7等,这个软件采用VS2008/.Net Framework2.0开发,因为有些系统默认没有安装.Net Framework2.0,所以在运行时需要确保客户机上已经安装上.Net Framework2.0,于是想到将软件打包。
制作软件安装包有几种工具和方案:一是利用Visual Studio自带的安装包制作工具;二是利用InstallShield这类收费的、专业的安装包制作工具;三是利用Inno Setup这类免费的、专业的安装包制作工具。
对Visual Studio自带的安装包制作工具研究得不深,早期曾经尝试过将软件打包成一个安装文件内,不过最终失败了,后来干脆就不再研究了;InstallShield这类收费的安装包制作软件功能确实强大,不过上手确实也不容易,再加上是收费的(尽管可以找到破解版,但是总觉得不爽),于是转而寻求利用Inno Setup来解决。
Inno Setup 是一个免费的 Windows 安装程序制作软件,它支持现在所有正在使用的 Windows 版本: 7, 2008 R2, Vista, XP, 2008, 2003, 2000, Me, 98, 95, 和 NT 4.0 (不需要服务包)。 并且Inno Setup最早出现在1997年,是一个免费开源的软件,即使作为商业使用也是如此。Inno Setup的官方网站网址是http://www.jrsoftware.org,当然也可以下载它的中文版本,比如[枫林夜思雨]汉化的Inno Setup就还不错,我给朋友打包时用的是英文版Inno Setup文件,只不过安装文件中用到的.isl文件被我翻译成中文了。
我们想到的办法就是将软件制作成安装包,运行安装包的时候会检查客户机上是否安装了.Net Framework2.0,如果没有则从局域网内服务器上下载.Net Framework2.0安装文件安装,然后继续安装和配置开发的软件。
从网上搜到这个一个解决方案,代码如下:
  [code]
  function InitializeSetup: Boolean;
  var Path:string ;
         ResultCode: Integer;
  begin
     if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v2.0') then
     begin
         Result := true;
     end
     else
     begin
         if MsgBox('系统检测到您没有安装.Net Framework2.0,是否立刻下载并安装?', mbConfirmation, MB_YESNO) = idYes then
         begin
             Path := ExpandConstant('{pf}\Internet Explorer\iexplore.exe');
             Exec(Path, 'http://www.xxx.com/down/dotnetfx2.exe', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
             MsgBox('请安装好.Net Framework2.0环境后,再运行本安装包程序!',mbInformation,MB_OK);
             Result := false;
         end
         else
         begin
             MsgBox('没有安装.Net Framework2.0环境,无法运行XXX程序,本安装程序即将退出!',mbInformation,MB_OK);
             Result := false;
         end;
     end;
  end;
上面这段代码的作用是通过检查注册表来判断客户机上是否安装了.Net Framework2.0,如果没有就从http://www.xxx.com/down/dotnetfx2.exe处下载,并提示用户安装下载的.Net Framework2.0的程序之后再安装本程序。这么做有一个优点,因为并不是所有的机器都没有安装.Net Framework2.0,所以仅仅是一部分没有安装的机器才会需要下载,这样也就不需要将.Net Framework2.0打包进安装包,是安装包比较小。
不过这样在某些情况下也会出现问题,比如开发了一个不错的软件,用户在办公室里上网并下载和安装了这个软件,觉得不错,拷贝到家里没有上网的机器上时就不能安装和使用了,这样麻烦就来了。因此下面想到了另一种解决办法,这种办法就是将.Net Framework2.0打包进安装文件,在安装开始之前检查客户机上是否安装了.Net Framework2.0,如果没有安装就将.Net Framework2.0安装文件从安装包里解压缩出来到临时文件夹下并从临时文件夹下安装,否则就直接安装开发后的软件,临时文件夹下的文件会在系统重新系统启动时被自动清理,不用担心占用磁盘空间。
以下是部分关键代码:
[Files]
.........
Source: "F:\周公的专栏\dotnetfx20.exe"; DestDir: "{tmp}"; Flags: ignoreversion
; 周公的专栏友情提示:dotnetfx20.exe并不会拷贝到安装后的目录中,而是在临时目录中,这样重启机器之后就会被删除掉

[code]
function CheckDotNet2_0():boolean;
begin
Result:=not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v2.0');
end;

function InitializeSetup(): Boolean;
var Path:string;
        ResultCode: Integer;
begin
    if CheckDotNet2_0() then
    begin
        ExtractTemporaryFile('dotnetfx20.exe');
        Exec(ExpandConstant('{tmp}\dotnetfx20.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
    end;
end;

通过上面的代码确保了不会将dotnetfx20.exe拷贝到安装后的文件夹中,在Visual Studio和InstallShield相信也应该会有这样的功能,只是笔者没有找到,这个功能我觉得比较实用,如果客户机器上已经安装了.Net Framework2.0的话不会在安装时不会感觉到有什么,如果没有安装就会将dotnetfx20.exe释放到临时文件夹下,并从临时文件夹下安装.Net Framework2.0,这样确保dotnetfx20.exe不会占用安装文件夹的空间。这样制作安装包的好处是在安装软件时无需担心用户是否联网,缺点是使安装文件略显有点大,因为制作的安装包中要包含一个20多M的dotnetfx20.exe,不过在网速和存储设备都不是问题的今天,这个不是什么太大的问题,当然是有点让人感觉略微地不爽,可能自己开发的软件才数百K,而必须附带一个20多M的dotnetfx20.exe。这也是没有办法的事情,像早期可以跨*nix和Windows的Java和现在可以跨不同版本的.NET,为了实现在不同平台上有相同的表现,就必须要运行时的支持,正所谓熊掌鱼肉不可兼得,虽然有些第三方开发的软件可以将Java或者.NET平台上的软件制作成无需运行时支持的exe文件,但是能否在各个平台上得到一致的表现,有待考证。
其实这种做法不仅可以用于检测.Net Framework2.0的情况,也可以用于其它情况,比如检测.Net Framework3.0或者.Net Framework3.5的情况,特别是当你向朋友展示你开发的WPF应用时;此外,还可以用于部署Java SE项目。
 
周公

2010年2月28日

用Inno Setup来解决.NetFramework安装问题的更多相关文章

  1. Inno Setup技巧[界面]自定义安装向导小图片宽度

    原文  blog.sina.com.cn/s/blog_5e3cc2f30100cj7e.html 英文版中安装向导右上角小图片的大小为55×55,汉化版中为55×51.如果图片超过规定的宽度将会被压 ...

  2. 使 Inno Setup 打包出的安装程序以管理员身份运行

    找到 Inno Setup 安装目录下的 SetupLdr.e32 文件,用 Resource Hacker 将其中的 Manifest 修改一下: 改为: <requestedExecutio ...

  3. inno setup检查是否已经安装

    [Registry] Root: HKLM; Subkey: "Software\MCS"; ValueType: string; ValueName: "MCSVers ...

  4. 【Inno Setup】查看是否安装了VC++ 2015 Redistributeable

    可能有必要先测一下注册表的这一项是否存在 if RegValueExists(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Ru ...

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

    使用Inno Setup 打包.NET程序,并自动安装.Net Framework http://www.cnblogs.com/xiaogangqq123/archive/2012/03/19/24 ...

  6. [Tool]Inno Setup创建软件安装程序。

    这篇博客将介绍如何使用Inno Setup创建一个软件安装程序. Inno Setup官网:http://www.jrsoftware.org/isinfo.php. 可以下载到最新的Inno Set ...

  7. inno setup介绍及官方网站地址

    使 用 笔 记 1.Inno Setup 是什么?Inno Setup 是一个免费的 Windows 安装程序制作软件.第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞 ...

  8. [!!!!!]Inno Setup教程-常见问题解答

    [转]Inno Setup教程-常见问题解答 功能 * 翻译 Inno Setup 文字  * 它支持 MBCS (多字节字符集) 吗?  * 将来会支持 Windows Installer 吗?   ...

  9. Inno Setup

    Inno Setup 是一款免费的window是安装制作软件,在功能设置和稳定性上的竞争力可能已经超过一些商业的安装程序制作软件.安装程序用编译脚本(.iss)的方式创建,脚本为类似.ini文件格式的 ...

随机推荐

  1. Struts2 实现文件上传和下载

    实现上传功能 Struts2实际上是使用的commons fileupload 组件,所以记得导包哦. 1.首先你应该有一个上传页面 <!-- file的name属性与action中的File类 ...

  2. Objective-C:Foundation框架-常用类-NSString全解

    Foundation框架中常用的类有字符串.集合.字典等,这里介绍字符串NSString.本文分别介绍了NSString的创建.从文件里读取NSString字符串.通过函数改变外部的NSString变 ...

  3. netty4 连通步骤

    转载:http://xw-z1985.iteye.com/blog/1973205 服务端依次发生的步骤 建立服务端监听套接字ServerSocketChannel,以及对应的管道pipeline: ...

  4. ZooKeeper(3.4.5) 使用Curator监听事件

    转载:http://www.mamicode.com/info-detail-494364.html 标签: ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher ...

  5. cl.exe

    http://blog.csdn.net/happyanger6/article/details/7589016

  6. POJ 1094 拓扑排序

    Description:      规定对于一个只有大写字母的字符串是有大小顺序的.如ABCD.即A<B.B<C.C<D.那么问题来了.现在第一行给你n, m代表序列里只会出现前n的 ...

  7. js基础之BOM

    一.window.open 栗子:阿里西西运行代码功能 var oBtn = document.getElementById('btn1'); var oTxt = document.getEleme ...

  8. HDU 4893 Wow! Such Sequence!(2014 Multi-University Training Contest 3)

    题意: 有三种操作: 1 x y: 表示给x位置加上y 2 x y:查询[x,y]的区间和 3 x y:将 [x,y] 区间上的数变为最接近的 Fibonacci. 思路: 1 操作按正常单调更新,区 ...

  9. 启动项目报错Error: listen EADDRINUSE

    我在使用elasticsearch的kibana插件时候,有一次启动,遇到这个错误: Error: listen EADDRINUSE 它的意思是,端口5601被其他进程占用. 故而,需要kill掉那 ...

  10. SelectedRows.CurrentRowSelected 和 DeleteItem

    procedure TBMListEh.SetCurrentRowSelected(Value: Boolean); var Index: Integer; Current: TUniBookmark ...