用Inno Setup来解决.NetFramework框架安装问题

本文介绍使用InnoSetup工具解决.NET Framework依赖问题的方法。通过检测目标系统是否已安装.NET Framework 2.0,实现自动下载或从安装包内提取安装文件的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间朋友接了一个项目,具体是开发一个安装在局域网内的软件,这个软件会定时连接局域网内的服务器来更新本地客户端的一些信息,因为在局域网内存在着多种不同的Windows版本,从WindowsXP、Windows2003及Windows2008到Windows7等,这个软件采用VS2008/.NetFramework2.0开发,因为有些系统默认没有安装.NetFramework2.0,所以在运行时需要确保客户机上已经安装上.NetFramework2.0,于是想到将软件打包。

制作软件安装包有几种工具和方案:一是利用VisualStudio自带的安装包制作工具;二是利用InstallShield这类收费的、专业的安装包制作工具;三是利用InnoSetup这类免费的、专业的安装包制作工具。

对VisualStudio自带的安装包制作工具研究得不深,早期曾经尝试过将软件打包成一个安装文件内,不过最终失败了,后来干脆就不再研究了;InstallShield这类收费的安装包制作软件功能确实强大,不过上手确实也不容易,再加上是收费的(尽管可以找到破解版,但是总觉得不爽),于是转而寻求利用InnoSetup来解决。

InnoSetup是一个免费的Windows安装程序制作软件,它支持现在所有正在使用的Windows版本:7,2008R2,Vista,XP,2008,2003,2000,Me,98,95,和NT4.0(不需要服务包)。并且InnoSetup最早出现在1997年,是一个免费开源的软件,即使作为商业使用也是如此。InnoSetup的官方网站网址是http://www.jrsoftware.org,当然也可以下载它的中文版本,比如[枫林夜思雨]汉化的InnoSetup就还不错,我给朋友打包时用的是英文版InnoSetup文件,只不过安装文件中用到的.isl文件被我翻译成中文了。

我们想到的办法就是将软件制作成安装包,运行安装包的时候会检查客户机上是否安装了.NetFramework2.0,如果没有则从局域网内服务器上下载.NetFramework2.0安装文件安装,然后继续安装和配置开发的软件。

从网上搜到这个一个解决方案,代码如下:

Code:
  1. [code]
  2. functionInitializeSetup:Boolean;
  3. varPath:string;
  4. ResultCode:Integer;
  5. begin
  6. ifRegKeyExists(HKLM,'SOFTWARE/Microsoft/.NETFramework/policy/v2.0')then
  7. begin
  8. Result:=true;
  9. end
  10. else
  11. begin
  12. ifMsgBox('系统检测到您没有安装.NetFramework2.0,是否立刻下载并安装?',mbConfirmation,MB_YESNO)=idYesthen
  13. begin
  14. Path:=ExpandConstant('{pf}/InternetExplorer/iexplore.exe');
  15. Exec(Path,'http://www.xxx.com/down/dotnetfx2.exe','',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
  16. MsgBox('请安装好.NetFramework2.0环境后,再运行本安装包程序!',mbInformation,MB_OK);
  17. Result:=false;
  18. end
  19. else
  20. begin
  21. MsgBox('没有安装.NetFramework2.0环境,无法运行XXX程序,本安装程序即将退出!',mbInformation,MB_OK);
  22. Result:=false;
  23. end;
  24. end;
  25. end;

上面这段代码的作用是通过检查注册表来判断客户机上是否安装了.NetFramework2.0,如果没有就从http://www.xxx.com/down/dotnetfx2.exe处下载,并提示用户安装下载的.NetFramework2.0的程序之后再安装本程序。这么做有一个优点,因为并不是所有的机器都没有安装.NetFramework2.0,所以仅仅是一部分没有安装的机器才会需要下载,这样也就不需要将.NetFramework2.0打包进安装包,是安装包比较小。

不过这样在某些情况下也会出现问题,比如开发了一个不错的软件,用户在办公室里上网并下载和安装了这个软件,觉得不错,拷贝到家里没有上网的机器上时就不能安装和使用了,这样麻烦就来了。因此下面想到了另一种解决办法,这种办法就是将.NetFramework2.0打包进安装文件,在安装开始之前检查客户机上是否安装了.NetFramework2.0,如果没有安装就将.NetFramework2.0安装文件从安装包里解压缩出来到临时文件夹下并从临时文件夹下安装,否则就直接安装开发后的软件,临时文件夹下的文件会在系统重新系统启动时被自动清理,不用担心占用磁盘空间。

以下是部分关键代码:

Code:
  1. [Files]
  2. .........
  3. Source:"F:/周公的专栏/dotnetfx20.exe";DestDir:"{tmp}";Flags:ignoreversion
  4. ;周公的专栏友情提示:dotnetfx20.exe并不会拷贝到安装后的目录中,而是在临时目录中,这样重启机器之后就会被删除掉
  5. [code]
  6. functionCheckDotNet2_0():boolean;
  7. begin
  8. Result:=notRegKeyExists(HKLM,'SOFTWARE/Microsoft/.NETFramework/policy/v2.0');
  9. end;
  10. functionInitializeSetup():Boolean;
  11. varPath:string;
  12. ResultCode:Integer;
  13. begin
  14. ifCheckDotNet2_0()then
  15. begin
  16. ExtractTemporaryFile('dotnetfx20.exe');
  17. Exec(ExpandConstant('{tmp}/dotnetfx20.exe'),'','',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
  18. end;
  19. end;

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

其实这种做法不仅可以用于检测.NetFramework2.0的情况,也可以用于其它情况,比如检测.NetFramework3.0或者.NetFramework3.5的情况,特别是当你向朋友展示你开发的WPF应用时;此外,还可以用于部署JavaSE项目。

周公

2010年2月28日

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值