原文:Wix打包系列(七) 添加系统必备组件的安装程序

我们知道在vs的打包工程中添加系统必备组件是一件很容易的事情,那么在wix中如何检测系统必备组件并在安装过程中安装这些组件。这里以.Net Framework组件作为必备组件为例:

7.1 检测.Net Framework 版本

   

步骤1:为安装项目添加WiX .NET extensions库的引用

如果是命令行方式使用wix,那么需要在candle和light的时候添加如下参数:

-ext WiXNetFxExtension
    如果在vs中使用wix,那么需要添加WixNetFxExtension.dll的引用,在wix安装目录下可以找到它。
   
    步骤2:为安装项目添加WiX .NET extensions命名空间
    添加了.NET extensions引用之后,还必须为源文件添加.NET extensions 命名空间,方式是为Sample.wxs源文件中Wix元素添加如下属性:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
   
    步骤3:引用适当版本的Property
    在.NET Framework extensions 已经定义了所有现有版本的.NET Framework的Property,包括service pack版本。如果我们需要在安装项目中使用这些属性,就必须使用引用它们;比如我们需要检测.Net Framework 2.0,就必须添加相应的Property引用:
<PropertyRef Id="NETFRAMEWORK20"/>

“NETFRAMEWORK20”就是.NET Framework extensions 中预定义的.Net Framework 2.0的属性;如果需要检测中文语言包,那么还必须添加”NETFRAMEWORK20_ZH_CN_LANGPACK” 属性;查看所有现有版本的.NET Framework的Properties,可以翻阅wix 帮助文档。

  
    步骤4:在Condition条件中使用预定义的Properties

我们可以在安装程序的启动条件中使用预定义的属性,从而判断系统是否安装指定的.NET Framework组件,如:

<Condition Message="This application requires .NET Framework 2.0. Please install the .NET Framework then run this installer again.">
<![CDATA[Installed OR NETFRAMEWORK20]]>
</Condition>
  上面代码意思是:如果没有安装.Net Framework 2.0, 将会中断安装程序执行,Installed 表示如果在修复或卸载安装时将不会检测.Net Framework组件。
   
   步骤5:编译生成安装程序
    在一个没有.Net Framework 2.0的系统环境中运行生成的安装程序,弹出提示安装.Net Framework 2.0的错误,然后安装程序被终止。
 
   
    现在我们的安装程序已经可以检测.Net Framework 2.0是否安装了,但是一般情况下,我们希望将.Net Framework组件作为安装程序的一部分,当检测到系统没有安装.Net Framework组件的时候会自动安装.Net Framework组件。windows installer不能将这些组件打包到我们安装程序中,但是我们可以跟vs打包一样,使用引导程序(bootstrapper)来实现,引导程序会先执行.Net Framework组件的安装,然后再执行我们的安装程序。下面我们提供2种方法,一种是编写xml代码的方式在Visual Studio中生成带引导程序的安装文件,另一种是使用BMG工具。
   
    7.2 使用Visual Studio制作系统必备引导程序
   
    wix本身不提供引导程序,但是我们可以使用Visual Studio中ClickOnce deployment部件提供的bootstrapper引导程序;下面我们来看看如何为.Net Framework组件生成ClickOnce 引导程序bootstrapper。
 
    步骤1:在Visual Studio中创建并编译wix安装项目
    要生车ClickOnce bootstrapper引导程序,我们不能再使用命令行模式,必须使用VS编译环境;在vs2005或以上版本,新建wix项目:

移除Product.wxs,将Sample示例源文件拷贝到wix Project所在的目录,并添加到wix项目中;添加wix命名空间中的wix Extension组件的引用,如图:

使用candle命令编译时,我们使用了变量参数-dVersion=1.0.0,这里同样需要设置,右键项目名称——》属性——》Build选项卡——》设置Build参数:

最后编译生成Sample项目,生成的安装文件在../bin/Debug/zh-cn下,我们也可以在上面的Build参数中指定安装语言,也可以同时生成多种语言版本的安装程序。

需要注意的是:在使用vs制作中文安装包时,如果引用了WixSqlExtension组件,那么就必须把SqlExtension的中文资源文件(点击下载)包括在项目中,否则会编译错误。而在命令行模式下制作中文安装包时,可以不使用SqlExtension中文资源文件,默认会使用自带的英文资源文件。

   

    步骤2: 用编辑器打开.wixproj文件

   首先,在vs中打开示例中的Sample项目,然后在解决方案管理器(Solution Explorer)中右键Sample项目,选择卸载项目Unload Project),继续在解决方案管理器(Solution Explorer)中右键Sample项目,选择编辑Sample.wixproj。

   

    步骤3: 添加必备组件的条目

    在Sample.wixproj文件的下添加如下代码:

  <ItemGroup>
<BootstrapperFile Include="Microsoft.Net.Framework.2.0">
<ProductName>.NET Framework 2.0</ProductName>
</BootstrapperFile>
</ItemGroup>

    Include 特性用于表示应安装的必备组件的名称。ProductName 项元数据是可选的,它作为备用项供生成引擎在找不到包时用作用户友好名称。除非未指定 ApplicationFile,否则这些项不是必选 MSBuild 输入参数。对于必须为应用程序安装的每个必备组件,都应包含一个相应的项。

如果 BootstrapperItemsApplicationFile 参数均未指定,则会导致生成错误。

步骤4:添加生成引导程序的任务

在Sample.wixproj文件中添加如下代码:

<Target Name="AfterBuild">
<GenerateBootstrapper ApplicationFile="zh-cn/$(TargetFileName)"
ApplicationName="Foobar 1.0"
BootstrapperItems="@(BootstrapperFile)"
ComponentsLocation="Relative"
CopyComponents="True"
OutputPath="$(OutputPath)"
Path="E:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/" />
</Target>

ApplicationFile指定引导程序在所有必备组件安装完以后开始安装应用程序时使用的文件的路径;$(TargetFileName)是安装程序的名称,如果是制作中文安装包,wix安装工程默认生成的安装文件在输出目录下的zh-cn目录下,这里根据实际生成目录的结构填写不同的路径

    ApplicationName是在bootstrapper引导程序执行时显示的应用程序的名称;
    BootstrapperItems指定要生成到引导程序中的产品;
    ComponentsLocation指定引导程序寻找要安装的安装必备组件的位置。此参数可具有下列值:
  • HomeSite:指示必备组件由组件供应商托管。

  • Relative:指示必备组件与应用程序在同一个位置。

  • Absolute:指示所有组件都将在一个集中的 URL 下找到。该值应当与 ComponentsUrl 输入参数结合使用,ComponentsUrl 指定包含安装必备组件的 URL。

如果未指定 ComponentsLocation,将默认使用 HomeSite

    CopyComponents如果为 true,则引导程序会将所有输出文件复制到 OutputPath 参数指定的路径。BootstrapperComponentFiles 参数的值都应当基于此路径。如果为 false,则不复制文件,而且 BootstrapperComponentFiles 值将基于 Path 参数的值。
    OutputPath指定 setup.exe 和所有包文件要复制到的位置,这里设置的目录是应用程序安装文件的输出目录。
    Path指定所有可用的必备组件包的位置,示例中的Path路径是对于安装了VS2005的用户而言的,如果是安装了VS2008的用户,则Path的值应该是:C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bootstrapper
   
    步骤5:生成安装程序
    保存修改后的Sample.wixproj文件,在解决方案管理器(Solution Explorer)中右键Sample项目,选择重新加载项目(Reload Project),在弹出窗口中选择“是”,然后生成项目。
   
    我们来看看效果,在没有.Net Framework 2.0的虚拟机中,运行setup.exe,会弹出安装.Net Framework 2.0的界面,如图:
    点击接受会开始安装.Net Framework 2.0组件,安装完.Net Framework 2.0后会自动安装Sample.msi。
   
   
    7.3 使用BMG工具制作自定义系统必备引导程序
   
    在使用ClickOnce发布时,vs自带了一个系统必备的列表(包括.Net Framework 和c++运行库等),列表中的必备程序我们是可以用上面的方法制作引导程序;但是这种方法只适用于将系统必备列表中的组件打包,而且需要编写一些xml代码,更好的方法是使用BMG(Bootstrapper Manifest Generator)工具,用它可以不用写任何代码为系统必备列表添加新的第三方组件,而且还可以为组件和安装程序创建引导程序。
   
    Visual studio2008版本的BMG工具可以到这个地址下载:http://code.msdn.microsoft.com/bmg/Release/ProjectReleases.aspx?ReleaseId=1567
   
    这里我用一个usb key的驱动程序作为安装必备程序的示例:
   
    1、下载安装BMG
   
    2、打开BMG,版本信息如下:
   
    3、点击菜单File—>New打开新建项目对话框,选择Package Manifest项目类型。在弹出的对话框中输入Project Name和Product Code;
   
    4、点击左上的Add Install File按钮,选择自定义必备程序所在的路径:
  
   
    5、点击OK,出现如下界面,输入Display Name,其他属性可以选填,然后点击Build生成
   
    6、在vs2008中我们就可以看到我们定义的系统必备程序:
   
    7、接着点击菜单—>New,项目类型选择MSBuild,点击OK后,出现如下界面:

在General选项卡中输入生成安装文件的名称Name,选择要安装的文件Installer。

8、接着点击Package选项卡,选择.net Framework 2.0 和USBKey Driver

9、点击Build按钮,选择生成目录,确定后生成MSBuild项目,在输出目录下生成安装文件和引导程序如下:

10、运行setup.exe安装引导程序,会出现安装USBKey Driver组件的界面,如下:

这里制作的USBKey Driver必备程序并没有设置启动条件和检查,也就是说不管机器上有没装这个驱动,都会执行驱动安装程序,要设置启动条件和检查,可以在第5步中设置相关的属性,具体可参考bmg帮助文档

Wix打包系列(七) 添加系统必备组件的安装程序的更多相关文章

  1. Wix打包系列 (六)制作升级和补丁包

    原文:Wix打包系列 (六)制作升级和补丁包 前面我们已经知道怎么制作一个完整安装包了,但我们的软件往往不能一次性就满足客户的需要,当客户需要我们给软件进行升级的时候,我们应该怎么做呢? 在这之前,我 ...

  2. Wix打包系列(一)如何使用wix制作安装程序

    原文:Wix打包系列(一)如何使用wix制作安装程序 最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多.收费 ...

  3. Wix打包系列(五) 部署数据库

    原文:Wix打包系列(五) 部署数据库 很多人在使用vs进行打包的时候,经常会为数据库部署的问题犯愁,即便是重写Installer类的方法,也不是很可靠方便,下面我们来看看在wix中如何部署数据库. ...

  4. Wix打包系列(四) 自定义UI

    原文:Wix打包系列(四) 自定义UI 除了标准的安装界面,如果我们要在安装时需要提供一些额外的信息时,这时就需要自定义界面来显示和录入这些信息. 4.1  自定义对话框 如上一章中我们测试数据库的连 ...

  5. Wix打包系列(三)自定义Action(Custom Action)

    原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...

  6. Wix打包系列(二)用户界面和本地化操作

    原文:Wix打包系列(二)用户界面和本地化操作 上一章节,我们已经大概知道如何对文件进行打包安装,不过我们也注意到,通过对Sample.wxs的编译链接,生成的msi安装包没有任何用户界面,只有一个安 ...

  7. VS报:"dll标记为系统必备组件,必须对其进行强签名"错误

    问题: VS生成程序时,报“要将程序集“XX.dll”标记为系统必备组件,必须对其进行强签名.”错误. 解决方法: 1)在报错的解决方案中找到一个可以发布的项目(引用该XX.dll的项目未必可以发布) ...

  8. warning MSB3162: 所选的“Microsoft Report Viewer 2012 Runtime”项需要“Microsoft.SqlServer.SQLSysClrTypes.11.0”。在“系统必备”对话框中选择缺少的系统必备组件,或者为缺少的系统必备组件创建引导程序包。

    warning MSB3162: 所选的“Microsoft Report Viewer 2012 Runtime”项需要“Microsoft.SqlServer.SQLSysClrTypes.11. ...

  9. 错误: 安装必备组件失败: 安装必备组件失败: SqlInstanceRtc 有关详细信息

    错误: 安装必备组件失败: 安装必备组件失败: SqlInstanceRtc 有关详细信息 查看错误得知是安装sqlexpr_x64.exe的时候出现了错误 解决: 通过打开skype镜像,找到sql ...

随机推荐

  1. Ubuntu Crontab

    Ubuntu启用Crontab 启动cron服务: service cron start 如果需要设置为开机时自动启动,则执行 sysv-rc-conf --level 35 cron on 另外,u ...

  2. js数组基础整理

    首页: 主要整理了一下数组中常用的一些基础知识,代码都是自己手敲,有不对的地方希望能指出,目前只有4篇,后续会不断的增加这一板块. 由于少于100字不能发所以把一些最基本的创建数组也写上. // 创建 ...

  3. Html input 限制输入中英文字符,及字符数量统计

    margin:20px 0px 0px; font-family:Arial; color:rgb(51,51,51)"> 验证用户名的一个例子: html: <input ty ...

  4. django admin manytomany获取所选字段值

    和一般views中前端数据的获取一样. def save_model(self, request, obj, form, change):         door_id_list= request. ...

  5. 大豆生物柴油驱动的大巴斯(Bus)

    请看下图: 这是大豆生物柴油(Soybean biodiesel)驱动的大巴斯(Bus)的外观,感觉非常有劲. 回想历史,1893年,德国学者Rudolf Diesel(1858-1913)发明了一种 ...

  6. python实现刷博器(适用于新浪、搜狐)

    本文总结于智普教育: 做点小东西,有成就感,才会有动力学下去哈! 先上代码: 1: import webbrowser as web 2: import time 3: import os 4: co ...

  7. Entity - 使用EF框架进行增删改查 - 模型先行

    模型先行:先创建数据库实体模型,然后再进行数据库的增删改查. 基本步骤是不变的,可参照 <Entity - 使用EF框架进行增删改查 - 数据库先行> 其中的不同是,在创建数据库实体模型的 ...

  8. 基于visual Studio2013解决面试题之0402合并升序链表并去重

     题目

  9. 编译Release版本小技巧

    原文:编译Release版本小技巧 由于项目中要部署的App有很多,每次发布一个版本后都有一堆垃圾文件,部署在众多的终端机上不注意的话十分容易搞错.记得以前在VS中是可以设置下不生成vhost和pdb ...

  10. android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用

    android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用,只要把Imageview的src给去掉就成了,src捕获了bac ...