我们刚刚将我们的安装程序从WiX 2.x 迁移到WiX 3.6并开始使用Burn.以前,我们通过将.msm文件包含在我们的MSI中来安装Visual C++可再发行组件.这些文件始终与我们用于构建产品的文件同步(Microsoft经常更新它们以包含安全修复程序).C:\Program Files\Common Files\Merge Modules
现在,我们希望仅在需要时使用Burn框架下载Visual C++可再发行组件.但是,Burn没有定义MsmPackage放置在其中的元素Chain.
使用Burn部署Visual C++可再发行组件的最佳方法是什么?
我有一个刻录安装,用户可以选择安装三个选项中的哪一个 - 每个选项直接与链中三个MsiPackages中的一个相关,例如:
<Chain>
<MsiPackage SourceFile="..\ProductA\bin\Release\ProductA.msi" InstallCondition="chkProductA" />
<MsiPackage SourceFile="..\ProductB\bin\Release\ProductB.msi" InstallCondition="chkProductA" />
<MsiPackage SourceFile="..\ProductC\bin\Release\ProductC.msi" InstallCondition="chkProductC" />
</Chain>
Run Code Online (Sandbox Code Playgroud)
一切都很好.但是,当我下次运行msi时,我只想重新安装/更新最初选择的项目 - 即如果只选择了productA,我不想安装B&C产品.
如何确定最初选择的内容?
我有一个自定义引导程序CustomBA和一个应用程序设置AppSetup.
我只希望AppSetup在添加/删除程序中可见,所以我删除了Bootstrapper的名称.这可确保它不在"添加/删除程序"中.
我有一个AppSetup的自定义卸载程序,它从程序菜单快捷方式调用.但是,这不会删除注册表中的Bootstrapper条目.
我应该添加自定义操作来删除引导程序注册表项还是有更直接的方法?
我正在尝试实现自动版本控制,这样当我构建我的Bootstrapper时,MyApp和Bootstrapper版本都会自动递增和同步.否则,对于具有匹配版本的每次安装尝试,您最终会在添加/删除程序中使用重复的引导条目.
当我构建引导程序时,AfterBuild目标用于GetAssemblyIdentity成功获取自动生成的MyApp版本,并且引导程序输出文件使用递增的版本号正确命名,例如MyApp.1.0.5123.1352.exe
但是,当我安装这个Bootstrapper时,添加/删除程序中显示的版本总是如此1.0.0.0.
我已尝试在Bootstrapper Bundle Version字段中使用绑定,但我无法读取MyApp版本.
使用!(bind.packageVersion.MyApp)结果永远不会增加1.0.0.0.在构建错误中
使用!(bind.assemblyName.MyApp)结果(未解析的绑定时变量).在构建错误中
使用!(bind.FileVersion.filAAF013CA9B89B07C81031AE69884BF11)结果(未解析的绑定时变量).< - 有意义,因为Setup项目中存在FileID ,这就是Bootstrapper项目.
我该怎么做才能让我的Bootstrapper Bundle与它所包装的MyApp具有相同的版本?
===== MyApp的\ AssemblyInfo.cs中=====
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)
===== Setup.wixproj =====
<Target Name="BeforeBuild">
<PropertyGroup>
<LinkerBaseInputPaths>..\MyApp\bin\$(Configuration)\</LinkerBaseInputPaths>
</PropertyGroup>
<HeatDirectory OutputFile="MyApp_Files.wxs" Directory="..\MyApp\bin\$(Configuration)\" DirectoryRefId="INSTALLLOCATION" ComponentGroupName="MyApp_Project" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" AutoGenerateGuids="false" GenerateGuidsNow="true" ToolPath="$(WixToolPath)" Condition="'%(ProjectReference.PackageThisProject)'=='True'" />
</Target>
Run Code Online (Sandbox Code Playgroud)
===== Bootstrapper.wixproj =====
<Target Name="AfterBuild">
<GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
<Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
</GetAssemblyIdentity>
<Copy SourceFiles=".\bin\$(Configuration)\$(OutputName).exe" DestinationFiles=".\bin\$(Configuration)\MyApp.%(AssemblyVersion.Version).exe" />
<Delete Files=".\bin\$(Configuration)\$(OutputName).exe" />
</Target>
Run Code Online (Sandbox Code Playgroud)
=====引导程序\ …
所以我有一个非常简单的刻录安装程序,主要包括.net升级或偶尔包含我们的应用程序需要与之交谈的硬件的驱动程序包.
MSI我们创建支持升级或降级.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Bundle Name="My App Name" Manufacturer="Company Name" Version="!(bind.packageVersion.MyAPP_MSI)"
IconSourceFile="MyIcon.ico" DisableModify="yes" DisableRemove="yes"
UpgradeCode="{15E598EF-89CE-470B-8CEF-E32C8983DA33}" >
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" >
<bal:WixStandardBootstrapperApplication
LogoFile="$(var.CoreComponents.TargetDir)InstallerGraphics\Bootstrapper_Logo.png"
LicenseFile="$(var.CoreComponents.TargetDir)AppRoot\App License.rtf"
SuppressOptionsUI="yes" />
</BootstrapperApplicationRef>
<Chain>
<PackageGroupRef Id="NetFx451Web"/>
<MsiPackage DisplayName="My full Application Name" Id="MyAPP_MSI" SourceFile="$(var.Installer_MyAppMSI_TargetPath)"
DisplayInternalUI="yes" ForcePerMachine="yes" Visible="yes" />
<MsiPackage DisplayName="My Hardware Driver" Id="Installer_MSI_Driver" SourceFile="$(var.Installer_Driver.TargetPath)"
DisplayInternalUI="yes" ForcePerMachine="yes" Visible="yes" />
</Chain>
</Bundle>
</Wix>
Run Code Online (Sandbox Code Playgroud)
我们通常有测试版,当用户想要从测试版降级到我们的稳定版时,他们不能简单地执行旧的EXE安装程序.他们必须明确地从"添加/删除程序"中删除以前的程序包以安装较旧的Burn EXE.
这不是基于MSI的安装的问题.我们如何回到该功能?
日志
[0CB8:067C][2014-06-23T11:10:04]i001: Burn v3.8.1128.0, Windows v6.1(Build 7601: Service Pack 1), path:\\iop-filesvr\IOP\Builds\Main\8.1.240\IO Practiceware Client Setup.exe, cmdline: '-burn.unelevated BurnPipe.{197B8193-6EFC-4ED0-AF90-DE7205F13E65} {CD23A8AB-520B-4F5D-BCB9-98998C5A1EC0} 2216'
[0CB8:067C][2014-06-23T11:10:04]i000: …Run Code Online (Sandbox Code Playgroud) 我试图在我的包中创建一个ExePackage [使用DownloadUrl属性],下载Sql Express 2014并使用以下代码安装它
<ExePackage Id="Sql2014Express"
DisplayName="SQL Server 2014 Express"
Cache="no"
Compressed="no"
PerMachine="yes"
Permanent="no"
Vital="yes"
Name="SQLEXPRWT_x64_ENU.exe"
DownloadUrl="http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAndTools%2064BIT/SQLEXPRWT_x64_ENU.exe"
InstallCommand="/ACTION=Install /INSTANCENAME=$(var.InstanceName) /FEATURES=SQL /SECURITYMODE=SQL [SqlVariable] /TCPENABLED=1 /SQLSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE" /SQLSVCSTARTUPTYPE=Auto /SQLSYSADMINACCOUNTS=BUILTIN\Administrators /ADDCURRENTUSERASSQLADMIN=FALSE /Q /HIDECONSOLE /SkipRules=RebootRequiredCheck /IAcceptSQLServerLicenseTerms"
UninstallCommand="/Action=Uninstall /INSTANCENAME=$(var.InstanceName) /FEATURES=SQL /Q /HIDECONSOLE"
DetectCondition="SqlInstanceFound"
InstallCondition="$(var.ServerInstall)">
<ExitCode Value ="3010" Behavior="forceReboot" />
</ExePackage>
Run Code Online (Sandbox Code Playgroud)
当我尝试构建安装程序包时,我收到以下错误....
Error 2 The system cannot find the file 'SourceDir\SQLEXPRWT_x64_ENU.exe'.
Run Code Online (Sandbox Code Playgroud)
我可以将SourceFile属性设置为本地文件,并将其包含在我的安装中,但我宁愿不必使用我的安装程序移动800mb +文件.
我有一个WIX_bundle(V1.0.0.0),它安装了4个第三方MSI版本(5.0.0.0).现在我的第三方MSI的新版本已更新(6.0.0.0).我用(v2.0.0.0)创建了一个新版本的WIX_Bundle,两个WIX包都有相同的升级代码.我想要发生的是新版本的WIX_Bundle应该卸载以前的版本(v1.0.0.0以及4个MSI)并安装新版本(v2.0.0.0和新的4个MSI).
但是当我尝试安装WIX_BUndle V2.0.0.0时,它会尝试安装新版本,而不是卸载以前的版本.我在这里错过了什么吗?
我也添加了RelatedBundle Action ="Upgrade"Id ="$(var.UpgradeCode)".但没有什么可以做的?
我的期望是否正确,卸载应该在新版本安装之前进行?我希望卸载以前的4个MSI,无论它们是否有升级,然后在新的WIX_Bundle(v2.0.0.0)中安装新版本.我可以强制这种情况发生吗?
当我设置一个Image填充窗口时,它似乎渲染在其他控件的顶部,并且通常会弄乱窗口.文件中的顺序似乎没有帮助,但是如果我把它放在它自己的Page部分中它表现得好一点.
有没有办法在窗口中的所有内容后面显示图像?
此外,其他控件似乎没有正确地呈现在它的顶部(文本有白色背景,按钮有白色方块),我猜他们需要在某处设置透明模式?
编辑:
以下是问题的示例,鼠标悬停时可以看到按钮和复选框,以及选择的文本:
