标签: wix3

重复使用WIX组件以加快蜡烛/光线

我是WIX的新手,所以请原谅我,如果我完全错过了这里的船,但我想知道是否有可能在wxs文件中重用组件(mwm,cab等)而不需要重新链接它们每次.我正在处理的安装程序有几个可执行文件,dll和配置文件,这些文件在每次安装之间都会发生变化.这些文件相当于大约5兆的安装程序.我想要重用的部分是大约350兆的图像/地图/数据库文件,这些文件不会经常变化,我不希望每次构建安装程序时都必须编译/链接.

我已经尝试为地图创建一个mwm文件,但是当我在wxs中引用它们时,它们会通过光链接到主.msi文件中.我已经尝试指定一个非嵌入式CAB文件来保存地图:

<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<Media Id="2" Cabinet="NewRiver.cab" EmbedCab="no" CompressionLevel="none" />
...
<Merge Id="NewRiverDigMap" SourceFile="..\Output\NewRiverDigitalMaps.msm" Language="1033" DiskId="2" />
Run Code Online (Sandbox Code Playgroud)

但每次光线运行时,独立的CAB文件都会重新生成 - 这需要一段时间.

我想过只是创建一个ZIP文件来与msi一起提供并让安装程序启动zip解压缩,但这对我来说似乎是反wix.我想在不再需要时删除这些文件.

还有其他类似操作的错误吗?我读过有关碎片的内容,但这似乎并不是我想要的.

谢谢,大卫

wix wix3

8
推荐指数
1
解决办法
3095
查看次数

在不卸载/升级其他功能的情况下升级WIX功能树中的单个功能

我正在尝试使用WIX创建一个安装项目,这将允许我安装单个产品的多个功能.如何更新其中一个已安装的功能(独立于其他已安装的功能),而无需重新安装功能树中的其他功能?

例如,我希望能够拥有一个名为HelloWolrd的项目(返回HelloWolrd),其中(惊喜)打印出"Hello world!" 屏幕上.假设我有三个这样的hello world应用程序,Hello World 1,Hello World 2和Hello World 3.每个应用程序都会在屏幕上显示Hello World 1,2或3.我想要的是创建一个MSI,它默认安装所有这三个"功能",但也允许稍后单独升级每个功能.

这是我的解决方案布局:

Solution Explorer http://img12.imageshack.us/img12/5671/solutionexplorerm.jpg

我的WIX Product.wxs文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="ca484210-c719-4b2e-b960-45212d407c11" Name="HelloWorldInstaller" Language="1033" Version="1.0.0.0" Manufacturer="HelloWorldInstaller" UpgradeCode="68eeb8cb-9ef3-443c-870c-9b406129f7ff">
        <Package InstallerVersion="200" Compressed="yes" />

        <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

        <!-- Create Directory Structure -->
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLLOCATION" Name="Hello World" />
            </Directory>
            <Directory Id="DesktopFolder" Name="Desktop"/>
        </Directory>

        <DirectoryRef Id="INSTALLLOCATION">
            <Component Id="HelloWorld1" Guid="6D1D9D33-DA17-4db3-8132-C39F32200C3A">
                <RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld1\Install" Action="createAndRemoveOnUninstall">
                    <RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
                </RegistryKey>

                <File Id="HelloWorld1.exe" …
Run Code Online (Sandbox Code Playgroud)

windows-installer wix wix3 setup-project feature-upgrade

8
推荐指数
1
解决办法
5320
查看次数

有没有办法将预处理器变量设置为属性的值?

我有一个包含以下代码的WiX包含文件

<Fragment Id="PropertyFragment">
  <Property Id="DynamicLanguageCode" Value="[SystemLanguageID]" />
  <?define productLanguage = [DynamicLanguageCode]?>
</Fragment>
Run Code Online (Sandbox Code Playgroud)

现在在我的WiX脚本中的Product标签中,我想将Language属性设置为productLanguage的值,因为它只需要可本地化的整数.有没有办法让我的变量被分配属性的值?

谢谢

xsd wix wix3

8
推荐指数
1
解决办法
1万
查看次数

在wix中注册com dll

如果不是自我注册.然后我们如何在使用WIX安装时执行COM dll注册?

根据教程,我使用了ComPlusApplication示例(非.net dll).但它不起作用.它无法注册.

我可以成功地从命令行使用regsvr32进行注册.我读到没有创建用于注册com dll的自定义操作.

那么最好的方法是什么?如果我们需要使用heat,我们在哪里编写命令并将结果wxs添加到主项目中?

com wix wix3 heat wix3.5

8
推荐指数
1
解决办法
7256
查看次数

在Visual Studio 2008和WiX(v3)中使用heat.exe收集.csproj

我发现Wix v3使用工具(heat.exe)将信息"收集"到WiX片段中.要么我正在寻找错误的位置,要么这是一个很薄的文件.

对于包含媒体文件的复杂文件夹结构,自动生成WiX片段(可能使用heat.exe)的最佳方法是:

  • 各种类型(ico/png/xaml/etc)
  • 这可能会定期更改(名称/位置/添加/删除)
  • 它被归类为"内容"并包含在.csproj中

这样他们可以通过WiX内置到安装程序中,并且可以承受升级和补丁吗?

背景资料

  1. 我找到了heat.exe,这似乎解决了自动生成WiX片段的要求
  2. 让"dir"收割机工作,我注意到"项目"收割机(命令行帮助)
  3. 媒体已经在C#项目文件中,因此注意到"-pog:Content"可能做得很好
  4. 粗略搜索发现过时的文档没有提到"项目"收割机
  5. 实现完整的项目安装程序可能与"项目"收割机完成,但不确定这是如何得到支持,以及陷阱是什么.
  6. 看到"PUT-GUID-HERE"的产生,并意识到guid的自动生成可能会有升级/补丁的影响.
  7. 意识到必须有人将这些工具用于类似目的,并且可能会指出我正确的方向.

它(相当)指出v3还没有"完成"(因此文档和教程的稀缺性).我现在的感觉是,在我的构建脚本中自动执行此操作并非易事,而且现在工具正在增长以简化此操作.

wix wix3 csproj fragment heat

7
推荐指数
1
解决办法
3803
查看次数

Wix:卸载时停止Windows服务

当我卸载我的服务时,我得到了错误,它说我必须在卸载之前停止这样的服务.这是不能令人满意的 - 卸载程序应该自动停止它.

我在几个月前发现了一个博客或新闻组的帖子,并让它正常工作,但现在它已停止为我工作.我没有链接到帖子......也许别人知道它在哪里?:)我想我改变了一些微妙的东西,它停止了工作.我发现Wix很难排除故障.

我正在使用以下include来从注册表中获取属性X_ WIN_ SERVICE_ NAME(抱歉,我不知道如何避免_转义在这里).它在安装时无关紧要,因为在那种情况下我使用输入文件显式设置它.这个包含在我的wxs文件中的任何组件之前使用.

<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">

<?ifndef SetupXWinServiceRegistryProperties ?>
<?define SetupXWinServiceRegistryProperties ?>

<?define XWinServiceRegistryKey='Software\X\Y'?>

<Property Id="X_WIN_SERVICE_NAME">
  <RegistrySearch Id="XWinServiceNameSearch"
                    Root="HKLM"
                    Key="$(var.XWinServiceRegistryKey)"
                    Name="ServiceName"
                    Type="raw"/>
</Property>

<?endif?>
</Include>
Run Code Online (Sandbox Code Playgroud)

以下include组件用于在安装时保存注册表值:

<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">

<?ifndef WriteXWinServiceRegistryProperties ?>
<?define WriteXWinServiceRegistryProperties ?>

<Component Id="CompWriteXWinServiceRegistryProps"
  Guid="some guid">

<!-- Write properties to the registry. Then they will be 
       accessable during uninstall. -->

<RegistryValue Root="HKLM"
   Key="$(var.XWinServiceRegistryKey)"
   Name="ServiceName"
   Type="string"
   Value="[X_WIN_SERVICE_NAME]"
   Action="write" />

</Component>

<?endif?>

</Include>
Run Code Online (Sandbox Code Playgroud)

我在安装后检查了我的系统,并在那里正确写入了注册表值.我的组件中设置服务的部分如下所示:

          <ServiceInstall Id="ServiceInstallXWinService"
                          Name="[X_WIN_SERVICE_NAME]"
                          Start="auto"
                          DisplayName="xxx"
                          Description="yyy"
                          Account="[X_WIN_SERVICE_USER]"
                          Password="[X_WIN_SERVICE_PASSWORD]"
                          Type="ownProcess"
                          ErrorControl="normal"
                          Vital="yes" /> …
Run Code Online (Sandbox Code Playgroud)

windows-services wix wix3

7
推荐指数
1
解决办法
4196
查看次数

Wix - 根据权限更改安装文件夹

我必须使用Wix创建一个安装包.如果管理员用户正在安装该程序包,则应将其安装到%programfiles%/ [applicationName]中,如果该用户是非管理员用户,则应将其安装到其本地配置文件文件夹(LocalAppDataFolder)中.

怎么可能?

wix wix3

7
推荐指数
1
解决办法
3102
查看次数

使用WiX如何根据属性更改禁用/启用控件?

在我有一个WiX Combobox的那一刻,我有一点大脑融化,当我改变选择时,我想禁用/启用其他UI控件.

  <ComboBox Property="SQLAUTHTYPE">
    <ListItem Value="WindowsAuth" Text="Windows Authentication" />
    <ListItem Value="SqlAuth" Text="SQL Authentication" />
  </ComboBox>
Run Code Online (Sandbox Code Playgroud)

那是这些事件被触发的时候......

  MSI (c) ... PROPERTY CHANGE: Modifying SQLAUTHTYPE property. Its current value is 'WindowsAuth'. Its new value: 'SqlAuth'.
  MSI (c) ... PROPERTY CHANGE: Modifying SQLAUTHTYPE property. Its current value is 'SqlAuth'. Its new value: 'WindowsAuth'.
Run Code Online (Sandbox Code Playgroud)

选择WindowsAuth时,以下UI控件被标记为已禁用,并且在选择SqlAuth时启用...

  <Control Type="Edit" Width="164" Height="16" X="25" Y="149" Id="SQLAccountTextbox" Property="SQLACCOUNT"
  <Control Type="Edit" Width="164" Height="16" X="190" Y="148" Id="SQLPasswordTextbox" Property="SQLPASSWORD" Password="yes" />
Run Code Online (Sandbox Code Playgroud)

user-interface wix properties wix3

7
推荐指数
1
解决办法
3886
查看次数

如何在MSBuild中使用Team Build Properties?

我使用默认的流程模板有一个简单的tfs-2010构建定义.在其中,我使用$(BuildID)定义了构建数字格式,以定义计算字段的一部分.这有效,我可以看到BuildID的价值.

现在我尝试将BuildID属性作为参数传递给MSBuild:

/p:SomeProperty=$(BuildID)
Run Code Online (Sandbox Code Playgroud)

但是,当我查看构建日志时,我看到SomeProperty字面上等于$(BuildID)而不是BuildID的值.

我错过了什么?

为清晰起见更新:我要问的是如何在构建定义中引用构建过程参数.例如,Build Number Format的默认表达式为$(BuildDefinitionName)_ $(Date:yyyyMMdd)$(Rev:.r)

msbuild wix wix3 tfsbuild tfs2010

7
推荐指数
1
解决办法
3498
查看次数

Wix:是否有任何wix命令来创建数据库用户?

是否可以使用任何wix命令来创建数据库并将用户添加到数据库中?如果是的话,有没有关于如何做到这一点的例子?

wix wix3 wix-extension wix3.5 wix3.6

7
推荐指数
1
解决办法
2203
查看次数