当前位置: 首页 > 编程日记 > 正文

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

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









本文转自周金桥51CTO博客,原文链接:http://blog.51cto.com/zhoufoxcn/279243 ,如需转载请自行联系原作者



相关文章:

我想,有间花房

你带我走进你的花房,我无法逃脱花的清香,我不知不觉忘记了方向,你说我世上最坚强,我说你世上最善良,你不知不觉和花儿一样也许每一位 爱花的姑娘,都想有一间属于自己 的花 房 ,在悠闲的午后&…

JS重写提示框(confirm)

<script language"javascript"> /** * 功能&#xff1a;显示提示窗口 * 作者&#xff1a;申楠 qq&#xff1a;38371354 email&#xff1a;amushen1yahoo.com.cn http;//amushen.cnblogs.com * 日期&#xff1a;2005-10-26 * 版本&#xff1a;1.1 * 备注&#…

实现通用人工智能还要多久?Hinton与AlphaGo之父这样回答

作者 | Klye Wiggers 译者 | 刘旭坤 责编 | 琥珀 出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09; 人工智能&#xff08;AI&#xff09;在即将过去的 2018 年进展神速&#xff0c;取得了很多令人瞩目的成就&#xff0c;比如预测用户感兴趣的音乐…

SQL Server 2008备份大全实战(七)

这一篇博文探讨下SQL Server 2008 备份的实际操作&#xff0c;事实上SQL Server 2008并不关心数据是备份到物理磁盘上还是磁带上&#xff0c;在SQL Server 2008数据库备份中&#xff0c;预定义的目标位置叫做设备。这里设备是对硬盘&#xff0c;磁带机等备份存储的通称。通俗些…

一个中心、三大原则,阿里这样做智能对话开发平台

作者 | 阿里巴巴高级算法专家 李永彬&#xff08;水德&#xff09;整理 | 一一出品 | AI科技大本营在阿里巴巴的X峰会上&#xff0c;阿里巴巴-智能服务事业部高级算法专家李永彬&#xff08;水德&#xff09;分享了小蜜智能开发平台的构建&#xff0c;他围绕平台来源、设计理念…

大学生目前普遍存在的问题,看你中招了没?

大学几多歌 上课时清醒没有发呆的多&#xff0c;发呆没有睡觉的多&#xff0c;睡觉没有玩手机的多。下课时自习没有吃零食多&#xff0c;吃零食没有看连续剧多&#xff0c;看连续剧没有游戏多。吃饭时吃早餐的没有吃午餐/晚餐的多&#xff0c;吃午餐/晚餐的没有点外卖的多。听讲…

javascript用感

最近两天一直与javascript打交道&#xff0c;现在想总结下所有值处 以下类型都是自己概括别名 1.创建型 例子: var objdocument.createElement("div");//例如创建个DIV var div1document.createElement("div"); div1.id"ddv"; div1.style.w…

Vulkan Tutorial 12 Fixed functions

Vertex input VkPipelineVertexInputStateCreateInfo结构体描述了顶点数据的格式&#xff0c;该结构体数据传递到vertex shader中。它以两种方式进行描述: Bindings:根据数据的间隙&#xff0c;确定数据是每个顶点或者是每个instance(instancing) Attribute 描述:描述将要进行…

年后跳槽BAT必看:10种数据结构、算法和编程课助你面试通关

作者 | javinpaul译者 | 大鱼编辑 | 一一出品 | AI 科技大本营进入 BAT 这样的巨头企业工作&#xff0c;无疑是很多程序员的梦想。但事实上&#xff0c;能通过这些公司高难度编程面试的只是一小撮人&#xff0c;大多数人因为理论知识和项目实践的匮乏导致在面试后很快被淘汰&am…

戚薇在冰箱放香水,是贫穷限制了想象力!

前有李诞冰箱里放面膜&#xff0c;今有戚薇冰箱里放香水&#xff0c;《拜托了冰箱》真是为观众们打开了新世界的大门。在昨晚播出的节目中&#xff0c;戚薇充分展现了她作为“美妆博主”的实力&#xff0c;冰箱里摆满的香水不仅让冰箱家族看得目瞪口呆&#xff0c;网友们也是激…

使用apache的activemq集合JMS处理异步消息

为什么80%的码农都做不了架构师&#xff1f;>>> 1&#xff1a;先去apache下载 http://activemq.apache.org/ &#xff0c;大约有25M&#xff0c;要有点耐心 直接打开就可以使用&#xff1b;当然它也提供了安装为windows service的方法 2&#xff1a;配置activemq 在…

中国大学生创业报告发布

由中国人民大学牵头&#xff0c;北京师范大学、上海交通大学等30余家高校、企业和社会组织联合跟踪调查的《2017年中国大学生创业报告近日发布。这份覆盖全国52所高校的报告表明&#xff0c;大学生创业意愿持续高涨&#xff0c;大学生创业层次也在不断提升&#xff0c;但大学生…

windows server 2012 application control policy

启用Application Control policy 组策略设置&#xff0c;可以实现基于用户或组的应用程序权限控制&#xff0c;有两点需要注意&#xff1a; 1、策略的顺序是从上到下执行的&#xff0c;allow的策略需要放在上面。 2、在客户端上&#xff0c;或者在远程桌面的服务器上需要启用ap…

你已经是个成熟的表格,该学会NLP了

作者 | 唐都钰、孙一博来源 | 微软亚洲研究院AI头条编者按&#xff1a;在我们的生活中&#xff0c;用语音查询天气&#xff0c;用必应搜索信息&#xff0c;这些常见的场景都离不开一种应用广泛的数据存储方式——表格&#xff08;table&#xff09;。如果让表格更智能一些&…

[Design] Flyweight Pattern

结构模式  结构模式描述如何将类或者类的对象结合在一起形成更大的结构。  结构模式描述两种不同的东西&#xff1a;类与类的实例。结构模式可以分为&#xff1a;类的结构模式和对象的结构模式两种。  类的结构模式&#xff1a;类的结构模式使用继承来把类、接口等组合在一…

网友们票选的2018 Best Paper,你pick谁?

整理 | 琥珀出品 | AI科技大本营不久前&#xff0c;Reddit 机器学习论坛上一位网友发布了一个帖子&#xff1a;“What is the best ML paper you read in 2018 and why?&#xff08;你认为 2018 年读过的最好的论文是哪篇&#xff1f;&#xff09;”吸引了各路网友前来回答。营…

微信小游戏创业,究竟是红海还是死海?

“跳一跳”、“弹球王者”、“海盗来了”、“斗地主”等等微信小游戏&#xff0c;你是不是很眼熟呢&#xff1f;这些都是前段时间被刷了屏的小游戏&#xff0c;以“海盗来了”为例&#xff0c;据透露&#xff0c;其月流水已经突破了 1000 万&#xff0c;单日流水峰值也达到了 2…

OSPF中的frame-relay(3) 点到多点非广播

hostname R1!interface Loopback0 ip address 1.1.1.1 255.255.255.255interface Serial0 ip address 192.168.1.1 255.255.255.0 encapsulation frame-relay ip ospf network point-to-multipoint non-broadcast //将接口类型指定为点对多点非广播 frame-relay map ip 192.1…

一步一步SharePoint 2007之十六:注册并配置一个网站用户

在前面的文章中&#xff0c;我已经介绍了如何创建管理帐户。创建其它帐户的方法是一样的。大家可以把这个注册系统放到自己的网站中&#xff0c;就可以成为网站的一部分了。本文将只讲解如何在管理工具中将用户手动加入到网站用户组中&#xff0c;至于如何将注册完后的用户自动…

Facebook再曝数据丑闻删除应用数据仍会被泄漏

据外媒报道&#xff0c;道德黑客、漏洞赏金猎人Inti De Ceukelaire于昨日披露&#xff0c;名为“NameTests”的第三方测验应用令1.2亿Facebook用户面临数据泄露风险&#xff0c;这进一步时使Facebook的数据丑闻升温。道德黑客Inti De Ceukelaire发现&#xff0c;只要用户注册Na…

榨菜肉丝汤的做法

<!-- /* Font Definitions */ font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} font-face {font-famil…

“不设边界”的云知声:从多场景AI芯片到视觉AI,誓要2019营收近3倍

记者| 杨丽 出品| AI科技大本营 若非要总结 2018、展望 2019 的话&#xff0c;可以借用云知声创始人兼 CEO 黄伟的一句点评&#xff1a;“所有伟大的公司都诞生于真实的生产需求。” 2019 年 1 月 2 日&#xff0c;云知声在京召开战略发布会&#xff0c;正式公布其正在研发的…

微软公布Win10正式版功能对比表,哪个版本适合你?

微软今天公布了Win10各个版本功能特性对照表&#xff0c;详细列出了Windows10系统的大多数功能以及哪些版本具备这些功能。通过这张表格可为消费者购买或升级Win10提供参考。 微软公布的原版表格为英文版&#xff08;可点此下载&#xff09;&#xff0c;IT之家将其翻译为中文&a…

linux tpm 测试完整记录,亲测有效。

没有tpm芯片&#xff0c;采用模拟器的方式来测试。 实验环境&#xff1a;内核版本 3.10.0-327 软件包准备&#xff1a; 内网&#xff0c;没有仓库&#xff0c;自己网上下载&#xff1a; 1. cmake-3.9.6-Linux-x86_64.tar.gz 解压后就已经有bin文件&#xff0c;可以直接使用bin下…

互联网流量太贵!新零售成创业新风口

什么是新零售?无人便利店、每个创业者都有自己的电商平台?运用人工智能、大数据等技术手段&#xff0c;对商品生产、流通、销售进行再升级&#xff0c;进而提高线上服务与线下体验?其实&#xff0c;说白了就是效率更高的零售新模式。联网早期的流量福利开始变弱&#xff0c;…

拼多多黄峥给陆奇“兼职”,欲挖掘这类AI人才

整理 | 一一出品 | AI科技大本营在上任 Y Combinator 中国创始人兼 CEO 四个月后&#xff0c;陆奇今日宣布三位兼职合伙人加盟 YC 中国&#xff0c;同时宣布新一期创业训练营正式完成招生工作&#xff0c;即将开始为期三个月的冬季训练营培训工作。三位兼职合伙人分别是拼多多创…

Crystal Reports中的字段

字段&#xff0c;是Crystal Reports呈现数据的基本单元&#xff0c;也是报表的数据中心。 在Crystal Reports中&#xff0c;字段的类型有数据库字段&#xff0c;公式字段&#xff0c;参数字段&#xff0c;组名字段&#xff0c;运行总计字段&#xff0c;特殊字段&#xff0c;未绑…

深度学习的发展可能已达极限!

【编者按】回首 2018 年&#xff0c;身处技术圈的你是否曾反思过些什么——科技与非科技企业界限的日益模糊、技术的发展现状和前景、科技发展的正向助推到负面效应&#xff0c;乃至个人心态上的变化。人文、生态、社会……玩技术的人看到的从来不仅仅是技术本身而已&#xff0…

大学生创业难?现在已不是问题!

现在越来越多的大学生离开学校加入了自主创业的队伍&#xff0c;那么你一定要知道政府为扶持大学生创业&#xff0c;出台的那些鼓励政策&#xff01;如果你符合以下条件&#xff1a;1、公司法人是普通高等院校&#xff08;高自考的不行&#xff09;毕业前2年的在校生和毕业后5年…

Oracle:彻底结束会话 ,彻底解锁

oracle会话被锁是经常的。但有时alter system kill session sid,serial#;并不能彻底的杀死会话。只能通过杀死Linux上对应的进程才行。以前都是通过v$session里的logon_time&#xff0c;和ps -ef|grep oracle所列出的时间大约的定位进程。然后结束。本来想把这个写成日志。但有…