我试图通过WiX 3.0让我的应用程序成为安装程序.确切的代码是:
<File Id="ServiceComponentMain" Name="$(var.myProgramService.TargetFileName)" Source="$(var.myProgramService.TargetPath)" DiskId="1" Vital="yes"/>
<!-- service will need to be installed under Local Service -->
<ServiceInstall
Id="MyProgramServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="MyProgramAddon"
DisplayName="[removed]"
Description="[removed]"
Start="auto"
Account="LocalService"
ErrorControl="ignore"
Interactive="no"/>
<ServiceControl Id="StartDDService" Name="MyProgramServiceInstaller" Start="install" Wait="no" />
<ServiceControl Id="StopDDService" Name="MyProgramServiceInstaller" Stop="both" Wait="yes" Remove="uninstall" />
Run Code Online (Sandbox Code Playgroud)
事情是由于某种原因,LocalService在"安装服务"步骤失败,如果我将其更改为"LocalSystem",则安装程序会在尝试启动服务时超时.
该服务在系统启动时手动启动,并且所有意图和目的都很有效.我听说在LocalService下正在使服务正常工作存在问题,但Google并没有真正帮助,因为每个人的回答都是"让它工作到kthx".
只是希望在安装过程中设置并启动此服务,就是这样.有帮助吗?谢谢!
我有一个使用WiX版本3的MSI版本.
我们正在部署的产品的所有先前安装程序在指定的配置下工作正常(即:如果存在先前版本,删除,然后安装新版本) - 但是,我们构建的新MSI在运行时不会安装所有文件'先删除'路径.
如果我们手动删除现有安装,然后运行新版本,则会安装所有文件 - 当我在Orca中检查MSI文件时,会显示文件和功能,似乎没问题.
我们已经尝试运行详细和额外的日志记录打开(/l*vx)然而我们只能看到文件是否未被注册然后安装.
有什么想法或建议吗?这让我们走上了墙.
我正在使用Wix3.我需要在用户卸载产品时打开网页.
有什么想法可以做到吗?
谢谢.
如何使用WiX在Windows"开始"菜单中创建子文件夹(多个级别)?
目前我能够将我的快捷方式放在"开始"菜单中,但只能在程序(开始/程序/ MyFolder)下的文件夹中,但我想更深入地嵌套我的快捷方式(开始/程序/ MyPlatform/MyProduct /等).我尝试了不同的组合,但唉.
<DirectoryRef Id="StartMenuMyProduct">
<Component Id="ApplicationShortcut" Guid="{PUT-SOME-GUID-HERE}">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="Configure My Product"
Description="Add or remove this and that"
Target="[MYPRODUCTDIR]ConfigureMyProduct.exe"
WorkingDirectory="MYPRODUCTDIR"/>
<RemoveFolder Id="StartMenuMyProduct"
On="uninstall"/>
<RemoveFolder Id="StartMenuMyPlatform"
On="uninstall"/>
<RegistryValue Root="HKCU"
Key="SOFTWARE\MyCompany\MyPlatform\My Product"
Name="Installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</DirectoryRef>
<!-- Shortcut to the configuration utility in the Windows Start menu -->
<Directory Id="ProgramMenuFolder">
<!--<Directory Id="StartMenuMyPlatform" Name="MyPlatform">-->
<Directory Id="StartMenuMyProduct" Name="My Product" />
<!--</Directory>-->
</Directory>
Run Code Online (Sandbox Code Playgroud) 我目前正在学习如何使用WiX创建msi安装程序,看起来我已经碰壁了.
当我创建包含单个环境所需的所有内容的MSI时,一切都很顺利.
我有功能和组件,可以安装我的MSI.
现在我正处于我想要在SQL Server风格的安装程序中转换它的阶段,在这个安装程序中你有多个实例支持.
一开始我想让用户获得一个允许他创建新实例或管理已有实例的屏幕.(更新/删除它们)
我花了整整两天的时间寻找解决方案,没有太多运气.
我已经找到了以下资源及其中的一些信息,但要么它们的实例数量有限,要么没有描述如何为用户提供上述选项的这种引导程序.
有没有人已经使用WiX实现了这一目标?或者,任何人都可以指向我往一些工作就如何实现这一点的例子吗?
我知道Installshield 2009可以做到这一点,但由于这只是一个爱好,我没有钱购买它.此外,我想在WiX中这样做,因为即将推出的Visual Studio 2010将改进对它的支持.
如何根据哪个Visual Studio配置处于活动状态来定义更改的Wix属性和值?例如,对于我们的发布版本,var x = 1,对于导出构建,var x = 2.
我想要做的是向安装程序用户显示其服务器上的网站列表,并允许他们选择一个(使用此处描述的方法:http://www.cmcrossroads.com/content/view/13160/120/,现在似乎已经破了,请看这里的核心代码).然后,安装程序将在所选网站中创建虚拟目录.
但是,我的搜索似乎表明,在WiX中指定网站的唯一方法是通过IP,端口和标头.要求这些不是非常用户友好,所以我留下了编写第二个自定义操作以从网站名称获取这些详细信息的想法.
有没有更好的办法?
BTW这需要在IIS6和IIS7中工作,以防影响答案.
卸载我的应用程序时,需要通知服务器,以便它可以释放分配给客户端的许可证密钥.这是通过Web服务调用完成的.
我创建了一个C#自定义动作来执行此操作.问题是,卸载程序正在退出,说它无法找到一个DLL.
msi的错误日志包含以下错误:
错误1723.此Windows Installer程序包存在问题.无法运行此安装所需的DLL.请联系您的支持人员或包装供应商.Action ReadLicenseKeyFromFile,entry:ReadLicenseKey,library:C:\ Windows\Installer\MSI4F42.tmp
我将函数ReadLicenseKey标记为自定义操作.自定义操作名为ReadLicenseKeyFromFile.
<Custom Action="ReadLicenseKeyFromFile" After="InstallInitialize">
REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE
</Custom>
<CustomAction Id="ReadLicenseKeyFromFile" BinaryKey="UnInstallCA.CA.dll" DllEntry="ReadLicenseKey" Execute="immediate" Return="check" />
<Binary Id="UnInstallCA.CA.dll" SourceFile="$(var.UnInstallCA.TargetDir)UnInstallCA.CA.dll" />
Run Code Online (Sandbox Code Playgroud)
自定义操作项目正在输出.CA.dll文件.我已经尝试安装文件作为设置的一部分,手动复制粘贴文件,没有对文件做任何事情......基本上尝试了所有可能的组合.
必须有一些我缺少的东西,所以请帮助.
将托管代码从x86迁移到x64平台时,我遇到了问题.我有一个WiX项目来创建一个MSI,它将通过Bootstrapper执行.
在x86平台上,文件将根据Project.wxs文件复制到"Program Files"中.但是如果通过Bootstrapper在x64平台上安装了相同的MSI,则默认情况下会将所有安装文件复制到"Program Files(x86)"中,并且应用程序的功能失败,因为它无法在12-hive层次结构中找到所需的文件.程序文件(对于64位,它是"C:\ Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG").
我尝试使用预处理器变量,如<?if $(var.ProcessorArchitecture)= x64?>,但我需要将项目属性中的此变量硬编码为x86或x64.最后,我最终为两个不同的平台提供了两个不同的MSI,这对我来说不是一个理想的解决方案.
那么,通过WiX,是否可以识别平台以确保在所需位置安装?
新的一天,新的问题;-)仍然需要与托管自定义操作斗争.我已经设法调用自定义操作并将一些测试数据传递给它.现在我想用我需要的真实数据替换testdata.这里问题就出现了:我想调用一个安装在我的安装子目录中的批处理文件.因此,我需要将安装路径传递给自定义操作.Afaik这可以使用customactiondata mechnism完成.但这不起作用.当我记录安装时,我可以看到习惯用户INSTALLLOCATION之外指向正确的路径,但是当我查看惯例时,customactiondata属性为空...
任何人都可以查看我的代码并给我一个提示我做错了什么?谢谢你的优点!
调用自定义操作的合并模块:
<Module Id="DflHelpInstaller" Language="1033" Version="1.0.0.0">
<Package Id="f952de58-1dc6-46b3-872a-7a49e2d9ea0a" Manufacturer="DflHelpInstaller" InstallerVersion="200" />
<Binary Id='RegisterDflHelpDll' SourceFile="$(var.REGISTERHELP.TargetDir)RegisterDflHelp.CA.dll" />
<CustomAction Id='RegisterDflHelp' BinaryKey='RegisterDflHelpDll' DllEntry='RegisterDflHelp' Execute='deferred' />
<CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='[INSTALLLOCATION]' Execute='immediate' />
<InstallExecuteSequence>
<Custom Action='RegisterDflHelp.SetProperty' After='CostFinalize' />
<Custom Action='RegisterDflHelp' After='InstallFiles' />
</InstallExecuteSequence>
<Directory Id="TARGETDIR" Name="SourceDir">
</Directory>
<ComponentGroupRef Id="HelpGroup"/>
</Module>
</Wix>
Run Code Online (Sandbox Code Playgroud)
使用MergeModule的安装程序项目概述:
....
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" SourceName="PFFiles">
<Directory Id="Company" Name='$(var.COMPANY)'>
<Directory Id="INSTALLLOCATION" SourceName='$var.v[SDK_VERSION]'>
<Component Id="MyBanner" Guid="C8C28B92-9326-4991-BFB1-BBDFDF3653AB">
<File Id ="Banner.bmp" Source="Banner.bmp" KeyPath="yes" DiskId="1"/>
</Component>
<Merge Id ="DflHelpInstaller" SourceFile="DflHelpInstaller.msm" Language="1033" DiskId="1" />
</Directory> …Run Code Online (Sandbox Code Playgroud)