wix制作的安装包 注册表在安装的时候出现这个问题 貌似是注册表被我玩坏了 有没有大神可以解决

Wix打包系列(一)如何使用wix制作安装程序
Wix打包系列(一)如何使用wix制作安装程序
发布时间: 20:41:52
编辑:www.fx114.net
本篇文章主要介绍了"Wix打包系列(一)如何使用wix制作安装程序",主要涉及到Wix打包系列(一)如何使用wix制作安装程序方面的内容,对于Wix打包系列(一)如何使用wix制作安装程序感兴趣的同学可以参考一下。
最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多。收费的商业打包工具不在我考虑范围内,于是在网上找到了wix,稍微了解了下,发现wix的确可以满足我的需求;但是网上wix中文的资料少的可怜,百度,google上搜索到关于wix中文的资料少的可怜,有的只是一些简单的应用,还不足以满足我的要求;没办法,只能靠自己了,还好项目不是很急,于是开始花时间慢慢熟悉wix了。一路熟悉下来,发现使用wix也是个不小的工程,因此我将我使用wix过程的一些主要的问题都记录下来,供以后自己和大家参考:
&& <span style="color:# 安装wix
&&& 首先,我们需要到网上下载一个wix安装文件,下载地址: ,这里我们下载的版本是WiX v3.0 released,以下所有示例程序都是运行在这个版本下的。
&&& wix是用C#写的,安装wix之前,必须安装 和
,这是wix 工具集运行环境必须的,但并不意味着安装应用程序的机器上就一定需要使用Net Framework运行环境,这取决于你的应用程序使用的开发语言环境。使用wix不尽可以打包.net应用程序,也可以打包java应用程序和其他语言开发的应用程序。
&&& 在开始使用wix之前,我们需要先下载,这些示例都来自,里面每个示例在WiX tutorial中都有详细说明,E文好的可以先看看;大家会发现WiX tutorial中有些地方比较难理解,可能是因为里面涉及到一些msi sdk的知识,文中并没有详细说明,我也是刚接触wix和msi不久,文中对有些概念可能会有理解不准确的地方。该文都是我学习和使用wix的经验,考虑到wix初学者,刚开始会尽量介绍的详细些。
&&& 1.2&wix简介
&&&& wix是微软Windows Installer XML的缩写,WiX 的源代码是使用 XML 文件编写的,然后经过预处理、编译与链接,以创建 Windows Installer 数据库。我们可以在命令行上使用 WiX 工具集或使用 MSBuild,来编译与链接 WiX 源代码,而且如果我们安装wix之前已经安装了了Visual Studio(vs2005或者vs2008,据说vs2010已经集成了wix3.0),则还可以在Visual Studio IDE环境中生成安装项目。
&&& 这里我们主要讨论命令行方式使用wix工具集,在第七章会提到如何使用在vs环境下使用wix;wix最常用的两个命令就是candle和light, candle是用来编译wix源文件的,light是用来链接编译后的中间文件生成msi安装包。为了了解他们的作用,我们看看wix怎么生成安装包的。
&& <span style="color:# 生成Samplefirst示例安装包
&&&我们先来了解他们的用法,在示例源码中找到SampleFirst,用vs或者其他文本编辑器打开SampleFirst.wxs,将其中的每个YOURGUID-XXXX-XXXX-XXXX-XXXXXXXXXXXX 替换成唯一的GUID标识,我们可以使用vs自带的GUID生成器,在vs工具菜单下选择创建GUID,必须确保每个GUID都是唯一的(注意这里可以GUID既可以是带大括号的,也可以不带大括号)。接着我们可以编译了,编译之前最好将C:/Program
Files/Windows Installer XML v3/bin目录设置到系统的环境变量path中,这样我们在任何目录下都可以执行命令了,在命令提示符下,我们执行以下命令进行编译:
candle.exe Samplefirst.wxs
执行成功后会在当前目录下生成SampleFirst.wixobj文件,接着我们执行light命令:
light.exe Samplefirst.wixobj
light命令执行成功后我们就可以看到生成的安装文件SampleFirst.msi,这样一个简单的msi安装包就制作成功了。
& & 1.4 SampleFirst代码&&
&&&&SampleFirst示例展示了最基本的wix应用,如果想要生成功能更丰富的安装包,还必须知道如何编写wix代码;wix源代码是标准的xml标记语言,我们打开SampleFirst.wxs文件,来看看代码的构成:
&&& &Product&标签是我们发布的产品的基本信息,Language和 Codepage是设置我们生成安装包的语言环境,以后章节我们会详细讲到本地化语言的配置;Name和Manufacturer很好理解;需要注意的是Id和UpgradeCode属性,他们是具有唯一标识的GUID编号,还有Version属性是发布产品的版本号(不包括修订版本号)。
&&&& 另外&Package&标签的ID也是具有唯一标识的GUID编号,所不同的是对于每次生成的安装包,我们都需要一个不同GUID,因此这里设置成*号,每次编译时时候编译器会自动为它生成一个GUID,关于这几个属性的作用我们将在制作升级程序和更新包的时候详细讲解。Description属性是安装包的全名或者叫描述;Comments可以理解成是注解,它是可选的;InstallerVersion则是指定运行该安装包所需要的Windows
Installer的最低版本;Compressed指定是否压缩安装包中的文件,一般我们都设置成yes,可以节省不少空间。
&&& &Media&标签设置文件存储方式,Cabinet是压缩包的名称,它必须和Package的Compressed属性配合使用,如果不设置Cabinet和EmbedCab属性,则Compressed必须设置为no;EmbedCab决定压缩包是否嵌入到安装文件中(.msi);如果安装的文件比较多比较大,我们也可以定义多个Media,将不同文件压缩到不同的Media中。
&&& &Property& 标签我们可以看成一个静态的变量,它的&#20540;是它的Value属性,一般的Property 我们在安装过程中以至于自定义的Action中都可以改变和使用它的&#20540;,后面我们会陆续介绍。
&&& &Directory&标签囊括了所有要安装的内容,包括应用程序,快捷方式,动态链接库,文档,注册表信息等;&Directory&嵌套代表了安装程序的目录结构:
&&& 关于最上层的Directory,它包含一个预定义的标识符”TARGETDIR”,而且它的Name也是预定义的&#20540;”SourceDir”;TARGETDIR是所有Directory目录的父目录,在每个Package安装包中必须包含一个并且只能有一个TARGETDIR
Directory。
&&&& 第二层的Directory标识符是ProgramFilesFolder,它也是一个预定义的标识,它指定软件默认的安装目录在系统盘的Program Files目录下;
&&& 第三层是我们自定义的Directory,默认情况它会在它的上一级Directory(ProgramFilesFolder
)下生成一个自定义的目录,目录名是Name属性的&#20540;;
&&& 最底层Directory标示符是INSTALLDIR,也是我们自定义的,根据我们的定义,默认情况下程序会安装在以下目录:系统盘符:/Program Files/Acme/Foobar 1.0/;INSTALLDIR的属性&#20540;是安装文件的绝对路径,在默认情况下它的&#20540;依赖于我们定义的目录结构,如果在安装过程中我们改变了安装路径,则INSTALLDIR属性&#20540;也会改变,此时它将不依赖于我们定义的目录结构,而将取决于我们选择的安装路径。
&&& 这里要注意的是,INSTALLDIR和ProgramFilesFolder是Directory的一个标识符,实际上我们定义的所有Directory的标识符都可以看做一个是Property 属性;而ProgramFilesFolder是Windows Installer中自带的一个Property 属性,Windows Installer&
会在启动时设置它的&#20540;;同样,Windows Installer 也会设置INSTALLDIR的&#20540;,也可以在其他地方引用它,即使你没有显式定义一个INSTALLDIR
Property。(关于Windows Installer 提供的属性列表,可以在msi sdk document中查到,参考;从其中我们可以看到下面的ProgramMenuFolder和DesktopFolder都是Windows
Installer 已经提供的属性。)
&&& 另外这里Directory的默认的INSTALLDIR&#20540;是根据目录结构自动计算出来的,如果我们要将某些文件安装在固定位置,比如E盘根目录下,则我们需要在显式定义一个Property ,Property 的Value属性就是要存放目录的位置。大家可以尝试一下在Fragment下添加如下代码,会出现什么效果:
&Property Id =&INSTALLDIR& Value=&E:/&/&
&&& ProgramMenuFolder
Directory中定义了安装在开始菜单-&程序中的快捷方式。
&&& &Component&标签中定义所有要安装的元素,它的子元素可以是File(文件)、Shortcut(快捷方式)、RemoveFolder、RegistryValue(注册表键)等,一个Component可以包含多个子元素,但是必须有一个并且只能有一个元素的KeyPath='yes'&
&&& &Feature&标签是定义安装的部件,我们可以将不同用处的安装文件放到不到的Feature部件中,然后在安装过程中定制安装不同的部件,关于Feature的具体功能和部件定制在第2章介绍时详细介绍;
&&& &Icon&标签定义的图标文件,这是应用程序执行文件里的图标,也可以是单独的图标文件。
&&& <span style="color:# 优化后的Sample代码&&
&&& 为了增加源文件的可读性,我将SampleFirst源文件做了一些优化,对照SampleFirst,我们来看看有什么变化:
&?xml version='1.0' encoding='windows-1252'?&
&Wix xmlns='/wix/2006/wi'&
&Product Name='Foobar 1.0' Id='{2C9A-4cdd-B02C-A0ABCAAE3413}' UpgradeCode='{F4F8195E-E907-42dd-BB90-CC}'
Language='1033' Codepage='1252' Version='$(var.Version)' Manufacturer='Acme Ltd.'&
&Package Id='*' Keywords='Installer' Description=&Acme's Foobar 1.0 Installer&
Comments='Foobar is a registered trademark of Acme Ltd.' Manufacturer='Acme Ltd.'
InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' /&
&Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt=&CD-ROM #1& /&
&Property Id='DiskPrompt' Value=&Acme's Foobar 1.0 Installation [1]& /&
&Icon Id=&Foobar10.exe& SourceFile=&$(var.Version)/FoobarAppl10.exe& /&
&Icon Id=&word.ico& SourceFile=&$(var.Version)/word.ico& /&
&Feature Id='Complete' Title='Foobar 1.0' Description='The complete package.'
Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'&
&Feature Id='MainProgram' Title='Program' Description='The main executable.' Level='1'&
&ComponentGroupRef Id='MainCompGroup' /&
&ComponentRef Id='compHelperLibrary' /&
&/Feature&
&Feature Id='Documentation' Title='Description' Description='The instruction manual.' Level='1000'&
&ComponentRef Id='compManual' /&
&/Feature&
&/Feature&
&/Product&
&Fragment&
&ComponentGroup Id =&MainCompGroup&&
&Component Id='compMainExecutable' Guid='{0008EE68-EA36-4d5d-8BC5-9A}' Directory='INSTALLDIR'&
&File Id='filFoobarEXE' Name='FoobarAppl10.exe' DiskId='1' Source='$(var.Version)/FoobarAppl10.exe' KeyPath='yes'&
&Shortcut Id=&startmenuFoobar10& Directory=&ProgramMenuDir& Name=&Foobar 1.0& WorkingDirectory='INSTALLDIR' Icon=&Foobar10.exe& IconIndex=&0& Advertise=&yes& /&
&Shortcut Id=&desktopFoobar10& Directory=&DesktopFolder& Name=&Foobar 1.0& WorkingDirectory='INSTALLDIR' Icon=&Foobar10.exe& IconIndex=&0& Advertise=&yes& /&
&/Component&
&Component Id=&compProgramMenuDir& Guid=&{6886685C-E1B1-48d9-B6A7-F17}& Directory=&ProgramMenuDir&&
&Shortcut Id=&UninstallProduct&
Name=&Uninstall My Application& Directory=&ProgramMenuDir& Target=&[SystemFolder]msiexec.exe& Arguments=&/x [ProductCode]& Description=&Uninstall&/&
&RemoveFolder Id='rmvProgramMenuDir' On='uninstall' /&
&RegistryValue Root='HKCU' Key='Software/[Manufacturer]/[ProductName]' Type='string' Value='' KeyPath='yes' /&
&/Component&
&/ComponentGroup&
&ComponentGroup Id='ExtraGroup'&
&Component Id='compHelperLibrary' Guid='{A30DAC3F-c-B530-B90A7BA8E514}' Directory='INSTALLDIR'&
&File Id='filHelperDLL' Name='Helper.dll' DiskId='1' Source='$(var.Version)/Helper.dll' KeyPath='yes' /&
&/Component&
&Component Id='compManual' Guid='{E48-415c-B4FD-A20E2EA869D5}' Directory='INSTALLDIR'&
&File Id='filManual' Name='Manual.pdf' DiskId='1' Source='$(var.Version)/Manual.pdf' KeyPath='yes'&
&Shortcut Id=&startmenuManual& Directory=&ProgramMenuDir& Name=&Instruction Manual& Icon=&word.ico& Advertise=&yes& /&
&/Component&
&/ComponentGroup&
&/Fragment&
&Fragment&
&Directory Id='TARGETDIR' Name='SourceDir'&
&Directory Id='ProgramFilesFolder' Name='PFiles'&
&Directory Id='ManufacturerDir' Name='Acme'&
&Directory Id='INSTALLDIR' Name='Foobar 1.0'&
&/Directory&
&/Directory&
&/Directory&
&Directory Id=&ProgramMenuFolder& Name=&Programs&&
&Directory Id=&ProgramMenuDir& Name=&Foobar 1.0&&
&/Directory&
&/Directory&
&Directory Id=&DesktopFolder& Name=&Desktop& /&
&/Directory&
&/Fragment&
&&&首先,为了方便版本管理,我把Product的Version属性改成变量形式,在candle命令中将Version的&#20540;传给编译器进行解析,这样我们不用在每次编译之前都去检查和修改源文件中的版本号了,而且我们以后会在源文件中多次使用这个版本号(特别是在发布升级包或更新补丁时),也可以减少出错的概率。
&&& 接着我们可以看到多出来2个跟Product并列的Fragment标签,它们是一些代码片段,这里跟SampleFirst很不一样,我们把SampleFirst中的一些结构搬到了Fragment中,但这并不影响我们最终生成安装包;我们可以使用*Ref元素来引用Fragment中定义的元素,比如我们把SampleFirst中复杂的Directory嵌套放到Fragment中,一切都显得更清晰明了了。
&&& 我们再看另一个Fragment标签,我把所有的Component都放在这里面,而且可以根据不同的模块分成多个ComponentGroup,与SampleFirst中不同的是,这里所有的Component标签并非嵌套在Directory标签中,因此所有的Component都需要指定Directory属性,它是我们之前定义的Directory的Id标识符;
&&& 为了避免跟其他属性混淆,这里我把元素的id等属性做了修改,对于Component compMainExecutable ,它包含执行文件File filFoobarEXE和文件的快捷方式,我们可以在File标记下直接使用Shortcut定义快捷方式,可以看到他是一个advertised
Shortcut,因此Component的KeyPath可以是FILE;
&&& 而对于Component compProgramMenuDir ,它包含3个子元素:
&&& UninstallProduct Shortcut会在ProgramMenuDir下给我们安装程序添加一个卸载程序的快捷方式;
&&& RemoveFolder 标签告诉我们会在uninstall的删除这个目录;我们可以看到Shortcut和RemoveFolder 标签都没有KeyPath属性,而Component必须有一个包含KeyPath的子标签,另外这里不能File
作为KeyPath,因为对于UninstallProduct&
Shortcut来说,因为指定了Target属性,所以他是一个non-advertised Shortcut,必须使用注册表键作为KeyPath;
&&& 一开始,对于Shortcut标签的advertised 属性感觉很是费解,后来仔细推敲了下,大概是这个意思:对于应用程序(filFoobarEXE)的快捷方式,它是通过ProductCode来标识的,只属于当前的软件产品,不能在不同应用程序之间共享,所以此时advertised 等于yes;而对于卸载程序(msiexec.exe),它是Windows Installer自带的卸载程序,可以被任何安装程序共享使用,所以advertised 等于no,但同时必须指定卸载程序的路径Target。一般来说,如果指定了Target属性,我们就认为它属于non-advertised
&&& 到这里我把大家容易出现编译问题的地方都说明了一下,如果仍遇到问题可以参考Wix Help文档和msi sdk document。
&&&&最后我们回到Product标签,这里有两个Icon,Foobar10.exe
Icon 使用的是执行文件的Icon,我们在Shortcut中使用IconIndex
指定Icon;另一个Icon是文件Icon,我们可以复制一个word.ico到我们打包目录下,在Shortcut中只需指定Icon的标识符就可以了。
&&& 至于Feature标记的作用,我们在下一章节再讲,下面我们来编译链接我们的源文件。
我们在编译源代码之前,先新建一个版本目录1.0.0,所有要安装的文件均放在该目录下,该版本的安装包也会生成到该目录,将前面我给的代码复制到编辑器中,保存到该目录下Sample.wxs文件中;源代码中FILE和Icon 中的Source属性就是源文件的路径,这里我们都使用的相对路径。
所有准备工作都已经做完了,在Sample.wxs 所在的目录执行candle命令进行编译,将Version属性传给编译器:
candle.exe -dVersion=1.0.0& Sample.wxs -out 1.0.0/
与中不同的是,这里我们需要指定输入文件和输出文件的路径,这样方便我们以后制作升级包的时候区分不同版本
然后执行light命令进行链接,生成msi安装包。
light.exe -out 1.0.0/Sample.msi 1.0.0/Sample.wixobj
下一章节,我们将介绍如何定义安装时用户界面,以及如何进行语言本地化的操作。
本文标题:
本页链接:使用Setup Factory安装包制作工具制作安装包
来源:博客园
在我们开发完软件后,除了极个别案例我们把整个目录复制给客户用外,我们一般都需要做成安装包,方便整个软件的部署操作,以安装包的部署操作可能简单的是复制文件,也可能包括一些注册表、数据库等额外的操作,不过安装包部署肯定是能够给客户提供专业、统一的软件安装体验,同时封装了很多细节方面的处理。在我们日常的基于.NET的开发中,VS2010之前我们还可以使用内置的安装包制作工具,自从VS2012、VS2013以后,微软把这个去掉,集成使用了InstallShield进行安装包的制作了,我自己在这方面也写了两篇随笔《》、《》,不过基于InstallShield的制作虽然可以完成安装包的打包操作,不过也不见得是比较方便的打包工具,本篇介绍的Setup Factory是一个非常高效,功能强大的安装包制作工具,在独立于VS之外,我们可以用它作为我们常规.NET开发的安装包制作,简单易用。&#13;1、Setup Factory介绍&#13;Setup Factory 是一个强大的安装程序制作工具。提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序。Setup Factory 的特性包括:工程向导、自定义对话框、主题/皮肤样式、运行时间模块、最小化支持、MD5编码序列号、250个功能函数的脚本编辑器、授权支持和其他特性等。&#13;目前使用的版本是Setup Factory 9.5,不过各个版本之间差异并不大,这个软件在网上也很容易得到(即使是特别版本的,呵呵),因此较InstallShield更为方便获取到,在简单的对这款安装包制作工具的了解后,基本上常规的功能都非常方便设置处理,确实是比较易用的。软件的界面效果如下所示。&#13;&#13;&#13;从软件的主要功能来讲,它的安装包制作,主要就是左边的任务栏的各个处理操作了,包括内容有:文件Files、设置Settings、屏幕Screens、动作Action、资源Resources、卸载UnInstall等操作。&#13;2、软件安装包的制作&#13;我们创建一个安装包,输入相关的公司、软件名称等,如下所示。&#13; &#13;一步步后,我们需要指定指定具体的位置,以便加入所需要的文件,如下所示。&#13;&#13;然后选择安装包的界面语言包,如下所示。&#13;&#13;进一步的操作,就可以选择环境的安装包,例如.NET4,如果选择这个依赖环境,那么在安装的过程中会自动安装,好像说需要在SetUpFactory软件所在的目录中新建一下目录:Dependencies\dotnet4 。并且将 dotNetFx40_Full_x86_x64.exe放在其中。&#13;&#13;接着需要设置一些安装包的操作,如是否包含卸载操作等等,如下界面所示。&#13;&#13;最后,程序自动加入指定目录的问价,在主体界面中显示对应的文件,如下安装包制作视图所示,就是制作一个客户关系管理软件的安装包界面视图,包含所需要安装的文件、文件文档、程序依赖文件等。&#13;&#13;在返回到主界面的安装包视图后,我们就是按照左边的任务工具栏的顺序,一步步的对安装包的参数进行设置即可。&#13;包含的内容有:文件Files、设置Settings、屏幕Screens、动作Action、资源Resources、卸载UnInstall等操作。我们在加入文件后,对执行文件的相关参数进行设置处理,如下所示。&#13;&#13;对执行文件的属性进行设置,根据情况设置相关的参数信息,如下界面所示。&#13;&#13;&#13;然后接着对设置信息进行处理,如指定安装包软件的名称、公司信息、安装版权信息、安装路径等,如下界面所示。&#13;&#13; &#13;安装包的屏幕显示,我们可以修改其中的图片,以及相关的提示信息、按钮信息等内容,如下界面所示。&#13; &#13;在弹出的界面里面,我们可以通过Project内容选择符合安装包的制作主题,在右下角里面,我们还可以单击编辑按钮,对样式图片进行修改,选择符合自己项目的背景图片。&#13;&#13;其他处理如动作Action、资源Resources等,我们根据情况进行设置即可,一般如果没有特殊,则不需要进行处理。&#13;卸载的操作,我们可以修改其中的提示名称,将其修改为中文的提示信息,如下所示。&#13;&#13;最后可以进行编译了,指定生成的目录和文件名称,编译就可以获得一个独立的安装包的。&#13;&#13;编译过程就是把所需的文件一步步加入到一个安装包文件里面,如下是进度提示所示。&#13; &#13; &#13;下面介绍的界面效果就是我完成后的安装包界面效果,包括了背景图片的修改,卸载信息的设置、安装包文件的信息等等,具体效果也可以下载我的客户关系管理软件进行了解。&#13;&#13;&#13;&#13;&#13;安装部署后,软件的快捷键在桌面上存在,并且可以看到【打开文件位置】的操作也可以了,这个在之前VS里面的安装包是没有的,呵呵,小细节。&#13;&#13;安装文件是一个独立的文本文件,安装Setup Factory工具后,直接使用,也可以使用其他文本编辑工具维护和查看。&#13;&#13; &#13;以上就是我对一个完整的客户关系管理软件的安装包,在Setup Factory工具上的制作过程,基本上安装包制作起来还是比较方便快捷的,而且最后也就是一个文本文件的信息,独立,比较好管理。&#13;对比InstallShield的笨重和麻烦,这个软件独立维护安装包也是非常方便的一件事情。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动下次自动登录
现在的位置:
& 综合 & 正文
用Wix制作VSPackage的安装包
做完VSPackage后,如何打包发布它?其实有很多种打包的方式,在这里我只介绍在VS2008下用Wix制作VSPackage的安装。您首先要下载并安装Wix toolset()。
创建测试用的VSPackage
新建一个VSPackage项目用来测试。为了演示安装后的效果,别忘了在向导中给它添加一个Menu Command。
创建Wix项目
新建一个项目,项目类型选择Wix-》Wix Project,如下图:
完成后的解决方案视图如下:
生成用于注册VSPackage的wxs文件
VSPackage要想使用,必须往注册表里添加一些信息,我们用regpkg这个命令来帮助我们把这些信息生成到一个wxs文件里。
首先编译我们的Package项目,然后用VS2008 SDK带的命令行转到Package的bin\debug目录,并运行下面的语句。
regpkg /wixfile:VSPackage1.wxs /codebase "&full-path&\VSPackage1.dll"
其中,&full-path&代表Package程序集所在目录的全路径,例如E:\VSPackageInstaller\VSPackage1\bin\debug。
这个命令运行成功后,会在相同目录下生成一个VSPackage1.wxs的文件,我们需要把这个文件添加到VSPackageInstaller项目下面。注意,添加进来之后,这个文件的Build Action默认是编译(Compile),我们需要把它改成内容(Content),因为这个VSPackage1.wsx文件需要包括在主Product.wsx中,在编译Product.wsx的时候去编译它。如下图:
添加安装逻辑
首先要给VSPackageInstaller项目添加WixUIExtension.dll的引用,如下图:
然后修改VSPackageInstaller项目下的Product.wxs为:
&?xml version="1.0" encoding="UTF-8"?&
&Wix xmlns="/wix/2006/wi"&
&Product Id="c5f-4d7d-bc29-11fedb49ebea" Name="VSPackageInstaller" Language="1033" Version="1.0.0.0" Manufacturer="VSPackageInstaller" UpgradeCode="0be-4c0a-aa57-ddb1fe4165df"&
&Package InstallerVersion="200" Compressed="yes" /&
&Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /&
&!--取出VS2008的devenv.exe路径--&
&Property Id="DEVENV_EXE_PATH"&
&RegistrySearch Id="RegSearch_DevenvExe_Path" Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VS" Name="EnvironmentPath" Type="raw" /&
&/Property&
&Directory Id="TARGETDIR" Name="SourceDir"&
&Directory Id="ProgramFilesFolder"&
&Directory Id="INSTALLLOCATION" Name="VSPackageInstaller"&
&Component Id="ProductComponent" Guid="42a--b2fa"&
&!--复制程序集--&
&File Id="VSPackage1"
Source="$(var.SolutionDir)\VSPackage1\bin\debug\VSPackage1.dll" /&
&!--把注册表信息包括进来--&
&?include VSPackage1.wxs ?&
&/Component&
&/Directory&
&/Directory&
&/Directory&
&Feature Id="ProductFeature" Title="VSPackageInstaller" Level="1"&
&ComponentRef Id="ProductComponent" /&
&/Feature&
&Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" /&
&UIRef Id="WixUI_InstallDir" /&
&InstallExecuteSequence&
&Custom Action="CA_DeployPackage" Before="InstallFinalize" /&
&/InstallExecuteSequence&
&!--执行devenv /setup /nosetupvstemplates,把我们的Package安装到vs2008里--&
&CustomAction Id="CA_DeployPackage" Property="DEVENV_EXE_PATH" ExeCommand="/setup /nosetupvstemplates" Impersonate="no" Execute="deferred" /&
&/Product&
和修改前相比,我们主要在Product.wxs里增加了如下内容:
搜索注册表,取出vs2008的devenv.exe程序的路径
把VSPackage.dll复制到目标目录
把注册表信息(VSPackage1.wxs)包括进来
运行devenv.exe /setup /nosetupvstemplates(由于我们的测试Package没有VSTemplate,所以加上了/nosetupvstemplates参数以提高速度)
修改完Product.wxs之后,我们还需要修改一下VSPackage1.wxs文件的下面这一行:
&Registry Name="CodeBase" Value="[#File_VSPackage1.dll]" Type="string" /&
&Registry Name="CodeBase" Value="[#VSPackage1]" Type="string" /&
也就是把CodeBase的Value改为
&File Id="VSPackage1" Source="$(var.SolutionDir)\VSPackage1\bin\debug\VSPackage1.dll" /&
中Id对应的值。
测试安装包
到此为止,我们的安装包已经可以用了,编译VSPackageInstaller项目,并运行VSPackageInstaller.msi,可以看到安装界面已经出来了。
安装成功之后,重启VS,点击工具菜单,可以看到我们的Package已经被安装进去了:
重新运行这个安装程序可以卸载掉我们的Package。
改进安装包
虽然我们的安装包已经可以用了,但还存在几个问题:
它是英文的
如果用户没装VS2008,安装程序会报错
安装时,不想出现license对话框
执行devenv.exe /setup /nosetupvstemplates时耗费的时间比较久,但安装程序没有任何提示
要想变成中文,需要下载,并作为嵌入的资源把它添加到VSPackageInstaller项目中。然后修改Product.wxs文件,把Product节点的Language从1033改为2052,并添加一个CodePage=“936”的属性。然后修改VSPackageInstaller的项目属性,在Build页签里,把“Cultures to build”改为zh-cn,如下图:
再重新编译VSPackageInstaller项目,会在bin\debug\zh-cn目录下找到新编译出来的msi。
如果想去掉安装时的license对话框,需要在Product.wsx的UI节点下增加下面的内容:
&Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"&1&/Publish&
&Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"&1&/Publish&
如果想在执行devenv.exe /setup /nosetupvstemplates时安装程序给出提示信息,需要在UI节点下指定ProgressText:
&ProgressText Action="CA_DeployPackage"&
正在配置Visual Studio 2008...(请稍等几分钟)
&/ProgressText&
如果想在安装时先判断客户端有没有安装VS2008,需要指定Condition,如:
&Condition Message="[ProductName] 必须运行在Visual Studio 2008里,所以请先安装Visual Studio 2008。"&DEVENV_EXE_PATH&/Condition&
这里的DEVENV_EXE_PATH是我们在上面搜索出来的devenv.exe的路径,这里通过判断这个路径是否为空来确定是否安装了VS2008。
最终的Product.wsx内容如下:
&?xml version="1.0" encoding="UTF-8"?&
&Wix xmlns="/wix/2006/wi"&
&Product Id="c5f-4d7d-bc29-11fedb49ebea" Name="VSPackage1" Language="2052" Codepage="936" Version="1.0.0.0" Manufacturer="VSPackage1" UpgradeCode="0be-4c0a-aa57-ddb1fe4165df"&
&Package InstallerVersion="200" Compressed="yes" /&
&Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /&
&!--取出VS2008的devenv.exe路径--&
&Property Id="DEVENV_EXE_PATH"&
&RegistrySearch Id="RegSearch_DevenvExe_Path" Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VS" Name="EnvironmentPath" Type="raw" /&
&/Property&
&!-- Launch conditions --&
&Condition Message="必须以管理员身份运行 [ProductName]安装程序。"&Privileged&/Condition&
&Condition Message="[ProductName] 必须运行在Visual Studio 2008里,所以请先安装Visual Studio 2008。"&DEVENV_EXE_PATH&/Condition&
&Directory Id="TARGETDIR" Name="SourceDir"&
&Directory Id="ProgramFilesFolder"&
&Directory Id="INSTALLLOCATION" Name="VSPackageInstaller"&
&Component Id="ProductComponent" Guid="42a--b2fa"&
&!--复制程序集--&
&File Id="VSPackage1"
Source="$(var.SolutionDir)\VSPackage1\bin\debug\VSPackage1.dll" /&
&!--把注册表信息包括进来--&
&?include VSPackage1.wxs ?&
<pre style="border-bottom-style: text-align: padding-b
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 wix 修改注册表 的文章

 

随机推荐