我对安装人员世界很新.
我已成功为我的应用程序创建了一个.msi,它正在使用快捷方式构建并正确卸载.
我的下一个目标是使用安装程序打包.Net 4.5并在安装我的应用程序之前安装它.
我还有一个需要安装的第三方应用程序.它被打包为msi.
根据我的收集,我需要开发一个Bootstraper解决方案,让这些应用程序按顺序安装.
任何人都可以提供如何以这种方式实现安装程序的指南吗?我的搜索提出了一些部分实现,假设在Visual Studio中设计了Wix Bootstrapper项目.
我正在使用WiX(3.6)Burn bootstrapper将必备组件(Bonjour)与我的程序设置捆绑在一起.它工作得很好,但是:
我想在退出时向我的INSTALLDIR运行可执行文件的末尾添加一个步骤.我有点困难,想出这个.
我试过了:
<CustomAction Id="LaunchApp" Directory="INSTALLDIR"
ExeCommand="[INSTALLDIR]my app name.exe"/>
Run Code Online (Sandbox Code Playgroud)
但是不知道把它放在我的Burn的捆绑wxs文件中的哪个位置.有什么指针吗?谢谢!
编辑:
我也尝试过以下内容:
<CustomAction Id="LaunchApp" Directory="INSTALLDIR"
ExeCommand="[INSTALLDIR]Any Send.exe"/>
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的安装程序MSI的末尾,但当它集成到Burn bootstrapper安装中时,此行似乎没有被执行.
我正在使用Wix 3.7.我正在尝试创建安装我的msi的wix burn bootstrapper.我在BA UI中添加了两个用于安装和取消的按钮.我正在使用C#进行BA UI设计.
我在安装按钮中添加了以下代码以进行启动安装.
MySampleBA.Model.Engine.Detect();
MySampleBA.hwnd = IntPtr.Zero;
MySampleBA.Model.Bootstrapper.PlanBegin += this.PlanBegin;
MySampleBA.Model.Bootstrapper.DetectPackageComplete += this.DetectedPackage;
MySampleBA.Model.Bootstrapper.DetectComplete += this.DetectComplete;
MySampleBA.Model.Bootstrapper.PlanPackageBegin += this.PlanPackageBegin;
MySampleBA.Model.Bootstrapper.PlanComplete += this.PlanComplete;
MySampleBA.Model.Bootstrapper.ExecuteMsiMessage += this.ExecuteMsiMessage;
MySampleBA.Model.Bootstrapper.ExecuteProgress += this.ApplyExecuteProgress;
MySampleBA.Model.Bootstrapper.PlanMsiFeature += this.PlanMsiFeature;
MySampleBA.Model.Bootstrapper.PlanPackageComplete += this.PlanPackageComplete;
MySampleBA.Model.Bootstrapper.Progress += this.ApplyProgress;
MySampleBA.Model.Bootstrapper.CacheAcquireProgress += this.CacheAcquireProgress;
MySampleBA.Model.Bootstrapper.CacheComplete += this.CacheComplete;
MySampleBA.Model.Bootstrapper.Error += this.ExecuteError;
MySampleBA.Model.Bootstrapper.ExecutePackageComplete += this.ExecuteComplte;
Run Code Online (Sandbox Code Playgroud)
并使用启动安装
MySampleBA.Model.Engine.Plan(LaunchAction.Install);
MySampleBA.Model.Engine.Apply(MySampleBA.hwnd);
Run Code Online (Sandbox Code Playgroud)
安装工作正常.但我在中途取消安装时遇到问题.
我看到了bootstrapper应用程序回滚链接.但我无法了解IDCANCEL以及如何通过按钮单击触发错误事件.
任何人都可以通过单击BA UI中的取消按钮详细说明如何停止安装?
我用它来隐藏许可证对话
<WixVariable Id="WixStdbaLicenseUrl" Value=""/
Run Code Online (Sandbox Code Playgroud)
哪个有效,直到我介绍一个自定义主题使用
<WixVariable Id="WixStdbaThemeXml" Value="Resource\RtfTheme.xml" />
<WixVariable Id="WixStdbaThemeWxl" Value="Resource\RtfTheme.wxl" />
Run Code Online (Sandbox Code Playgroud)
我的主题只是内置RtfTheme的一个副本,经过微调.我改变了窗口大小,并删除了修复按钮.
当我这样做时,会显示许可证对话框(尽管文本为空).我希望对话保持隐藏.
为什么?怎么修?
这是我尝试过的几种变体之一:
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense" >
<bal:WixStandardBootstrapperApplication
LicenseFile="..\..\Tools\Building\buildIncludes\LicenseAgreement-Memo.rtf"
LogoFile="..\..\Tools\Building\buildIncludes\my.logo.png"
SuppressOptionsUI="yes"
/>
</BootstrapperApplicationRef>
<!-- supress license display in boot strapper -->
<WixVariable Id="WixStdbaLicenseUrl" Value=""/>
<WixVariable Id="WixStdbaLicenseFile" Value=""/>
<!-- we are using a customized theme -->
<WixVariable Id="WixStdbaThemeXml" Value="Resource\RtfTheme.xml" />
<WixVariable Id="WixStdbaThemeWxl" Value="Resource\RtfTheme.wxl" />
Run Code Online (Sandbox Code Playgroud) 我的安装程序将.NET 4.5作为先决条件,当在Vista上运行我的安装程序(安装了.NET 4.0)时,它会按预期启动先决条件引导程序.单击"安装"会将对话框移动到进度页面,这就是它停止的位置.它只是暂时停留在0%,然后引导程序消失(退出).
日志片段:
[0A30:0360][2013-07-11T10:41:23]i300: Apply begin
[093C:06F4][2013-07-11T10:41:23]i360: Creating a system restore point.
[093C:06F4][2013-07-11T10:41:28]i361: Created a system restore point.
[0A30:0360][2013-07-11T10:41:28]i399: Apply complete, result: 0x0, restart: None, ba requested restart: No
[0A30:0360][2013-07-11T10:41:28]i500: Shutting down, exit code: 0x0
[0A30:0360][2013-07-11T10:41:28]i000: The prerequisites were not successfully installed, error: 0x0. The bootstrapper application will be not reloaded.
Run Code Online (Sandbox Code Playgroud)
我的.NET包(这是包中的第一个包):
<PackageGroup Id="Netfx45Full">
<ExePackage Id="Netfx45Full"
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="..\Common\PreRequisites\MSIL\dotNetFx45_Full_x86_x64.exe"
InstallCondition="NOT (Netfx4FullVersion="4.5.50709" OR Netfx4x64FullVersion="4.5.50709")"
DetectCondition="(Netfx4FullVersion="4.5.50709") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.5.50709"))" />
</PackageGroup>
Run Code Online (Sandbox Code Playgroud)
我的bootstrappercore.config有以下内容:
<wix.bootstrapper>
<host assemblyName="Bootstrapper">
<supportedFramework …Run Code Online (Sandbox Code Playgroud) 当我更改文本框值时,它不会在视图模型中更新.
这是我在视图中的文本框xaml
<TextBox Height="23" HorizontalAlignment="Left" Margin="153,65,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Path=InstallPath, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)
完整的xaml视图,
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<Grid>
<Button Content="Configure Logger" Height="44" HorizontalAlignment="Left" Margin="402,125,0,0" Name="button1" VerticalAlignment="Top" Width="108" Click="button1_Click" />
<Button Content="Load DB" Height="43" HorizontalAlignment="Left" Margin="402,200,0,0" Name="button3" VerticalAlignment="Top" Width="108" Click="button3_Click" />
<TextBlock Height="23" HorizontalAlignment="Left" Margin="46,36,0,0" Name="textBlock1" Text="SQL Server" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="153,36,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" TextChanged="textBox1_TextChanged" />
<GroupBox Header="DB Names" HorizontalAlignment="Left" Margin="54,114,0,0" Name="groupBox1" VerticalAlignment="Top" >
</GroupBox>
<TextBlock Text="Test bootstrapper application." Margin="10" FontSize="18" HorizontalAlignment="Center" Foreground="Red" VerticalAlignment="Top" />
<TextBlock Height="23" …Run Code Online (Sandbox Code Playgroud) 我正在使用WiX 3.6(但如果需要可以升级到3.8)并且有一个用BURN编写的启动器,这几乎可以完成我需要的一切,除了这个问题; 我似乎无法破解.
我有两个变量; Product_XYZ和Product_ABC.第一个包含通过注册表搜索填充的文件夹路径(因此如果搜索没有找到我的reg密钥,它可能是空白的),另一个是硬编码的(即"[ProgramFilesFolder]\ABC").
我只是(?)想要将InstallFolder变量(通过Options按钮显示在UI中)设置为Product_XYZ变量中的值(如果它不是空白).如果它是空白的,我想将InstallFolder设置为Product_ABC中的值.
即
If Product_XYZ <> "" then
InstallFolder = [Product_XYZ]
else
InstallFolder = [Product_ABC]
endif
Run Code Online (Sandbox Code Playgroud)
但显然使用BURN逻辑!!
谁能帮帮我吗 ?
干杯,
克里斯.
我正在努力解决我的自定义引导程序升级问题.通过关注这个线程,我正在使用LaunchAction.Install.
这确实升级了产品以及Boostrapper,但较旧的Bootstrapper仍然存在,如下面的屏幕截图所示.

如果我从这里调用ver 1.0.0.0,它会显示Dialog to Install,但不会执行任何操作.但是,调用ver 1.0.1.0会让我选择卸载产品.但是,在卸载时,它只会自行删除,并且"我的产品"会被遗忘.
我也尝试过
_bootstrapper.Engine.Plan(LaunchAction.UpdateReplace);
Run Code Online (Sandbox Code Playgroud)
和
_bootstrapper.Engine.Plan(LaunchAction.UpdateReplaceEmbedded);
Run Code Online (Sandbox Code Playgroud)
但它没有效果.
问题:如何在不落入上述情况的情况下升级旧安装?有谁能提供CustomBA升级的工作示例?
问候
我试图检测以前安装的包的版本号是什么。然而,burn 似乎没有找到它,尽管它适当地检测到它将进行重大升级。
这是我的 bundle xml 的相关部分的样子:
<?define BUNDLE_UPGRADE_CODE=my_upgrade_code_guid?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle UpgradeCode="$(var.BUNDLE_UPGRADE_CODE)" DisableModify="yes" ...>
<util:ProductSearch UpgradeCode="$(var.BUNDLE_UPGRADE_CODE)" Variable="PreviousVersion" />
<BootstrapperApplicationRef ... />
<Chain>
<ExePackage Id="my_exe_package".../>
<MsiPackage Id="my_msi_package" .../>
</Chain>
</Bundle>
</Wix>
Run Code Online (Sandbox Code Playgroud)
想法是 ProductSearch 应该使用升级代码检测任何产品并将版本号放在变量中PreviousVersion以供以后使用。但是,burn 似乎没有检测到任何带有此升级代码的现有产品,而是始终将版本设置为“ 0.0.0.0”。以下是日志文件的相关部分(为清晰起见进行了一些编辑):
...: Detect begin, 2 packages
...: Product or related product not found: {my_upgrade_code_guid}
...: Setting version variable 'PreviousVersion' to value '0.0.0.0'
...: Detected related bundle: {previous_bundle_product_code}, type: Upgrade, scope: PerMachine, version: 1.0.0.0, operation: MajorUpgrade
...: Detected related package: {previous_msi_product_code}, scope: PerMachine, …Run Code Online (Sandbox Code Playgroud) 软件:
我们一直在尝试将 SQL Server Express 2016 的命名实例安装为 VS 安装程序安装项目的一部分,但没有成功。
我们已尝试InstallNamedInstance()按以下方式调用并给出结果:
SQLEXPR_x64_ENU.exe从管理员 cmd 窗口使用相同的命令行参数运行:成功InstallNamedInstance()从控制台应用程序调用并从管理员 cmd 窗口运行控制台应用程序:成功我注意到 msi 运行时的当前用户是NT AUTHORITY\SYSTEM. 每当安装程序项目失败时,它都会失败并显示以下消息:
运行 SQL Server 安装程序的帐户不具有以下一项或全部权限:备份文件和目录的权限、管理审核和安全日志的权限以及调试程序的权限。要继续,请使用具有这两项权利的帐户。欲了解更多信息,请参阅 http://msdn.microsoft.com/en-us/library/ms813696.aspx, http://msdn.microsoft.com/en-us/library/ms813959.aspx和 HTTP:// MSDN .microsoft.com/en-us/library/ms813847.aspx。
这是安装程序项目的限制还是我遗漏了什么?使用 AdvancedInstaller 会有更好的运气吗?
请注意,安装程序项目的先决条件对我们不起作用,因为我们必须创建 SQL Server Express 的命名实例,而且我们无法看到如何将命令行参数传递给先决条件。
private void InstallNamedInstance()
{
// NOTE: Change below instance name to get unique instances (or uninstall previous instance)
var InstanceName = "TFPICDATABASES2";
var proc …Run Code Online (Sandbox Code Playgroud) sql-server windows-installer burn sql-server-express visual-studio-2017
burn ×10
wix ×9
bootstrapper ×5
.net-4.5 ×1
installation ×1
mvvm ×1
sql-server ×1
windows ×1
wix3.10 ×1
wix3.6 ×1
wpf ×1