前段时间朋友接了一个项目,具体是开发一个***在局域网内的软件,这个软件会定时连接局域网内的服务器来更新本地客户端的一些信息,因为在局域网内存在着多种不同的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,&,&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:&B&&&&&&var&Path:string&;&&&&&&&&&&ResultCode:&I&&&&&&begin&&&&&&&&if&RegKeyExists(HKLM,&'SOFTWARE/Microsoft/.NETFramework/policy/v2.0')&then&&&&&&&&begin&&&&&&&&&&Result&:=&&&&&&&&&end&&&&&&&&else&&&&&&&&begin&&&&&&&&&&if&MsgBox('系统检测到您没有***.Net&Framework2.0,是否立刻下载并***?',&mbConfirmation,&MB_YESNO)&=&idYes&then&&&&&&&&&&begin&&&&&&&&&&&&Path&:=&ExpandConstant('{pf}/Internet&Explorer/iexplore.exe');&&&&&&&&&&&&Exec(Path,&'/down/dotnetfx2.exe',&'',&SW_SHOWNORMAL,&ewWaitUntilTerminated,&ResultCode);&&&&&&&&&&&&MsgBox('请***好.Net&Framework2.0环境后,再运行本***包程序!',mbInformation,MB_OK);&&&&&&&&&&&&Result&:=&&&&&&&&&&&end&&&&&&&&&&else&&&&&&&&&&begin&&&&&&&&&&&&MsgBox('没有***.Net&Framework2.0环境,无法运行XXX程序,本***程序即将退出!',mbInformation,MB_OK);&&&&&&&&&&&&Result&:=&&&&&&&&&&&&&&&&&&&&&&&&&&&
上面这段代码的作用是通过检查注册表来判断客户机上是否***了.Net&Framework2.0,如果没有就从/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():&& begin&& Result:=not&RegKeyExists(HKLM,&'SOFTWARE/Microsoft/.NETFramework/policy/v2.0');&&
&& && function&InitializeSetup():&B&& var&Path:&& &&&&ResultCode:&I&& begin&& &&if&CheckDotNet2_0()&then&& &&begin&& &&&&ExtractTemporaryFile('dotnetfx20.exe');&& &&&&Exec(ExpandConstant('{tmp}/dotnetfx20.exe'),&'',&'',&SW_SHOWNORMAL,&ewWaitUntilTerminated,&ResultCode);&&
通过上面的代码确保了不会将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项目。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:351次
排名:千里之外.Net&Framework&3.5***失败的解决办法
尽管一些网站提供.NET Framework 3.5 SP1离线完全***包,但还是官方的比较安全。
不过官方完全***包在***时居然需要在网上下载语言包,而且下载速度很慢,让人无法忍受,而在无法上网的环境下部署,就会更麻烦。
***时需要上网下载,其实是下载中文语言包,我们“强迫”其***英文版,就不会出现下载的情况,自己下载***中文语言包快得多了。
以下操作均在命令提示符状态(控制台)下进行
执行dotnetfx35.exe/x,解压到一个目录(如D:"),此时会生成一个D:"wcu目录
进入D:" wcu"dotNetFramework" ,执行dotNetFx35setup.exe/lang:ENU 便可
注意:***完成后得到的是英文版的.NET Framework 3.5
SP1,需要中文版,下载中文语言包便可,中文语言包有X86和X64两种,注意选择。
下载地址:Microsoft .NET Framework 3.5 Service
pack 1 (Full Package)
Microsoft .NET Framework 3.5 SP1 语言包(中文)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。