您的位置:首页 > 其它

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

2010-03-09 10:17 351 查看
FROM:用Inno Setup来解决.NetFramework框架安装问题

前段时间朋友接了一个项目,具体是开发一个安装在局域网内的软件,这个软件会定时连接局域网内的服务器来更新本地客户端的一些信息,因为在局域网内存在着多种不同的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
项目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: