前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Wix制作VSPackage的安装包

用Wix制作VSPackage的安装包

作者头像
明年我18
发布2019-09-18 11:39:08
2.5K0
发布2019-09-18 11:39:08
举报
文章被收录于专栏:明年我18

做完VSPackage后,如何打包发布它?其实有很多种打包的方式,在这里我只介绍在VS2008下用Wix制作VSPackage的安装程序。您首先要下载并安装Wix toolset(http://wix.codeplex.com/)。

创建测试用的VSPackage

新建一个VSPackage项目用来测试。为了演示安装后的效果,别忘了在向导中给它添加一个Menu Command。

创建Wix项目

新建一个项目,项目类型选择Wix-》Wix Project,如下图:

aa
aa

完成后的解决方案视图如下:

image
image

生成用于注册VSPackage的wxs文件

VSPackage要想使用,必须往注册表里添加一些信息,我们用regpkg这个命令来帮助我们把这些信息生成到一个wxs文件里。

首先编译我们的Package项目,然后用VS2008 SDK带的命令行转到Package的bin\debug目录,并运行下面的语句。

代码语言:javascript
复制
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的时候去编译它。如下图:

image
image

添加安装逻辑

首先要给VSPackageInstaller项目添加WixUIExtension.dll的引用,如下图:

image
image

然后修改VSPackageInstaller项目下的Product.wxs为:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">    <Product Id="4981e388-4c5f-4d7d-bc29-11fedb49ebea" Name="VSPackageInstaller" Language="1033" Version="1.0.0.0" Manufacturer="VSPackageInstaller" UpgradeCode="0b0867f6-f86e-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="42a95449-0cc2-4045-a9e1-b2f4296a376a">             <!--复制程序集-->             <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" />    <UI>      <UIRef Id="WixUI_InstallDir" />          </UI>    <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></Wix>

和修改前相比,我们主要在Product.wxs里增加了如下内容:

  1. 搜索注册表,取出vs2008的devenv.exe程序的路径
  2. 把VSPackage.dll复制到目标目录
  3. 把注册表信息(VSPackage1.wxs)包括进来
  4. 运行devenv.exe /setup /nosetupvstemplates(由于我们的测试Package没有VSTemplate,所以加上了/nosetupvstemplates参数以提高速度)

修改完Product.wxs之后,我们还需要修改一下VSPackage1.wxs文件的下面这一行:

代码语言:javascript
复制
<Registry Name="CodeBase" Value="[#File_VSPackage1.dll]" Type="string" />

修改为:

代码语言:javascript
复制
<Registry Name="CodeBase" Value="[#VSPackage1]" Type="string" />

也就是把CodeBase的Value改为

代码语言:javascript
复制
<File Id="VSPackage1" Source="$(var.SolutionDir)\VSPackage1\bin\debug\VSPackage1.dll" />

中Id对应的值。

测试安装包

到此为止,我们的安装包已经可以用了,编译VSPackageInstaller项目,并运行VSPackageInstaller.msi,可以看到安装界面已经出来了。

image
image

安装成功之后,重启VS,点击工具菜单,可以看到我们的Package已经被安装进去了:

image
image

重新运行这个安装程序可以卸载掉我们的Package。

改进安装包

虽然我们的安装包已经可以用了,但还存在几个问题:

  1. 它是英文的
  2. 如果用户没装VS2008,安装程序会报错
  3. 安装时,不想出现license对话框
  4. 执行devenv.exe /setup /nosetupvstemplates时耗费的时间比较久,但安装程序没有任何提示

要想变成中文,需要下载中文的wxl文件,并作为嵌入的资源把它添加到VSPackageInstaller项目中。然后修改Product.wxs文件,把Product节点的Language从1033改为2052,并添加一个CodePage=“936”的属性。然后修改VSPackageInstaller的项目属性,在Build页签里,把“Cultures to build”改为zh-cn,如下图:

image
image

再重新编译VSPackageInstaller项目,会在bin\debug\zh-cn目录下找到新编译出来的msi。

如果想去掉安装时的license对话框,需要在Product.wsx的UI节点下增加下面的内容:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<ProgressText Action="CA_DeployPackage">  正在配置Visual Studio 2008...(请稍等几分钟)</ProgressText>

如果想在安装时先判断客户端有没有安装VS2008,需要指定Condition,如:

代码语言:javascript
复制
<Condition Message="[ProductName] 必须运行在Visual Studio 2008里,所以请先安装Visual Studio 2008。">DEVENV_EXE_PATH</Condition>

这里的DEVENV_EXE_PATH是我们在上面搜索出来的devenv.exe的路径,这里通过判断这个路径是否为空来确定是否安装了VS2008。

最终的Product.wsx内容如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">    <Product Id="4981e388-4c5f-4d7d-bc29-11fedb49ebea" Name="VSPackage1" Language="2052" Codepage="936" Version="1.0.0.0" Manufacturer="VSPackage1" UpgradeCode="0b0867f6-f86e-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="42a95449-0cc2-4045-a9e1-b2f4296a376a">             <!--复制程序集-->             <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" />    <UI>      <UIRef Id="WixUI_InstallDir" />      <!-- skip licence dialog -->      <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>      <ProgressText Action="CA_DeployPackage">        正在配置Visual Studio 2008...(请稍等几分钟)      </ProgressText>    </UI>    <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></Wix>

最终的效果如下:

image
image
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建测试用的VSPackage
  • 创建Wix项目
  • 生成用于注册VSPackage的wxs文件
  • 添加安装逻辑
  • 测试安装包
  • 改进安装包
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档