- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 WiX 3.7 的刻录/托管 Bootstrap 应用程序功能来创建基于 MBA 的自定义安装程序。对于我的包链中的每个包,在执行 MinorUpdate 时,我可以很容易地检测到哪些包功能已经安装,以确保我在升级期间通过使用 Bootstrap 的 WiX 基类中提供的这些事件来维护这些功能选择: DetectPackageComplete
、DetectMsiFeature
、DetectRelatedBundle
、DetectRelatedMsiPackage
、DetectComplete
。
但是,在 MajorUpgrade 期间,我只看到一种确定安装了哪些包的方法,但没有看到如何确定安装了哪些功能,因为 DetectMsiFeature 事件不会触发。 我尝试在产品配置中使用 MigrateFeatures
标志,但这似乎不起作用(或者我没有正确使用它)。
在 WiX 中使用自定义托管 Bootstrap 应用程序执行 MajorUpgrade 时,检测/迁移现有功能的正确方法是什么?
注意:如果有帮助,我可以提供包含所有代码的完整工作 VS 解决方案。
Bundle.wxs:<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Bundle Name="Bootstrapper1" Version="1.1.0.0" Manufacturer="Knights Who Say Ni" UpgradeCode="e6fbf160-d1d9-4b38-b293-94d60eae876f" Compressed="yes">
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" >
<Payload SourceFile="$(var.ManagedBootstrapperApplication.TargetPath)" />
<!-- other files here -->
</BootstrapperApplicationRef>
<Chain>
<PackageGroupRef Id="NetFx40Web" />
<MsiPackage SourceFile="$(var.SetupProject1.TargetPath)" EnableFeatureSelection="yes" Vital="yes" Compressed="yes" />
</Chain>
</Bundle>
</Wix>
产品.wxs:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="SetupProject1" Language="1033" Codepage="1252"
Version="1.1.0.0" Manufacturer="Knights Who Say Ni"
UpgradeCode="5fcd463a-3287-4fdf-bf00-d5d74baeccda">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade AllowSameVersionUpgrades="no" AllowDowngrades="no" MigrateFeatures="yes" DowngradeErrorMessage="Bring me a shrubbery!" />
<MediaTemplate EmbedCab="yes" />
<Feature Id="feature_one" Title="Primary Feature" Level="1">
<Component Id="CMP_emptyFile1" Guid="{1740AFA6-A98F-482A-B319-A153AA1BEF10}" Directory="INSTALLFOLDER">
<File Id="file_emptyFile1" Checksum="yes" KeyPath="yes" Source="TextFile1.txt" />
</Component>
</Feature>
<Feature Id="feature_Two" Title="Optional Feature" Level="2">
<Component Id="CMP_emptyFile2" Guid="{F0831C98-AF35-4F5E-BE9A-2F5E3ECF893C}" Directory="INSTALLFOLDER">
<File Id="file_emptyFile2" Checksum="yes" KeyPath="yes" Source="TextFile2.txt" />
</Component>
</Feature>
</Product>
</Wix>
自定义 Bootstrap .cs
public class CustomBootstrapperApplication : BootstrapperApplication {
protected override void Run() {
DetectPackageComplete += HandlePackageDetected;
DetectMsiFeature += HandleFeatureDetected;
DetectRelatedBundle += HandleExistingBundleDetected;
DetectRelatedMsiPackage += HandleExistingPackageDetected;
DetectComplete += HandleDetectComplete;
this.Engine.Detect();
//blocks here until DetectComplete fires...
}
private void HandleExistingPackageDetected(object sender, DetectRelatedMsiPackageEventArgs e) {
Log(string.Format("Detected Related Package {2} ({1}) at version {3} which is a {0}",
e.Operation, e.PackageId, e.ProductCode, e.Version));
}
private void HandleExistingBundleDetected(object sender, DetectRelatedBundleEventArgs e) {
Log(string.Format("Detected Related {2} Bundle {0} at version {1} which is a {3}",
e.ProductCode, e.Version, e.RelationType, e.Operation));
}
private void HandleFeatureDetected(object sender, DetectMsiFeatureEventArgs e) {
Log(string.Format("Feature {0} from Package {1} detected in state {2}",
e.FeatureId, e.PackageId, e.State));
}
private void HandlePackageDetected(object sender, DetectPackageCompleteEventArgs e) {
Log(string.Format("Package {0} Detected in State {1}",
e.PackageId, e.State));
}
private void HandleDetectComplete(object sender, DetectCompleteEventArgs e)
{ /* release the main thread to continue with work */ }
}
升级输出:
请注意,该软件包和两个功能都安装在 v1.0.0 中,并且检测到状态为 Absent。检测到相关包,但未包含任何功能详细信息。
Detected Related Upgrade Bundle {5eff0a3c-4b0d-4fd9-875f-05117c07f373) at version 1.0.0.0 which is a MajorUpgradePackage NetFx4OWeb Detected in State PresentDetected Related Package {540AE32D-75C0-4BF3-A72D-ADBE97FSFF3E} (SetupProject1.msi) at version 1.0.0.0 which is a MajorUpgradeFeature feature_one from Package SetupProjectl.msi detected in state AbsentFeature feature_Two from Package SetupProjecti .msi detected in state AbsentPackage SetupProject1.msi Detected in State Absent
最佳答案
我正在标记 Bob Arnson's response作为答案,因为它给了我插入它前进所需的东西,但对于遇到这篇文章的其他人,我想我会提供更多关于如何使用 WiX 提供的 收集功能状态的细节>ProductInstallation
类(位于 WiX SDK 中的 Microsoft.Deployment.WindowsInstaller.dll 程序集中),因此无需自己直接调用 native MSI API。
这是一个可以注册到 DetectRelatedMsiPackage
事件的方法示例。请注意,您需要存储收集到的信息,以便您可以在计划阶段设置适当的状态。
private void DetectRelatedMsiPackageHandler(object sender, DetectRelatedMsiPackageEventArgs e)
{
var existingPackageProductCode = e.ProductCode;
var actionToBeAppliedToExistingPackage = e.Operation;
var existingPackageId = e.PackageId;
var existingPackageVersion = e.Version;
Log(string.Format("Detected existing related package {0} (product: {1}) at version {2}, which will be {3}",
existingPackageId, existingPackageProductCode, existingPackageVersion,
actionToBeAppliedToExistingPackage));
if (actionToBeAppliedToExistingPackage == RelatedOperation.MajorUpgrade)
{
//requires reference to WiX Toolset\SDK\Microsoft.Deployment.WindowsInstaller.dll
var installedPackage = new Microsoft.Deployment.WindowsInstaller.ProductInstallation(existingPackageProductCode);
if (!installedPackage.IsInstalled) {
Log(string.Format("Migrating Package {0}, which is not installed, so marking it and it's features as Absent", existingPackageId));
//TODO: add logic to store state so that during Plan phase can set package with package with product code = existingPackageProductCode to PackageState.Absent
} else {
Log(string.Format("Migrating features for MajorUpgrade of Package {0}", existingPackageId));
foreach (var currentInstallFeature in installedPackage.Features) {
if (currentInstallFeature.State == InstallState.Local) {
Log(string.Format("Migrating feature {1} of Package {0} - marking as Present", existingPackageId, currentInstallFeature.FeatureName));
//TODO: add logic to store state so that during Plan phase can set package and feature states based on this info
} else {
Log(string.Format("Migrating feature {1} of Package {0} - marking as Absent", existingPackageId, currentInstallFeature.FeatureName));
//TODO: add logic to store state so that during Plan phase can set package and feature states based on this info
}
}
}
}
}
关于c# - 如何使用 WiX Burn MBA bundle 在 MajorUpgrade 期间检测当前安装的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17552989/
我有一个刻录安装,用户可以选择安装三个选项中的哪一个 - 每个选项都直接与链中的三个 MsiPackages 之一相关,例如: 一切都很好。但是,当我下次运行 msi 时,我只想
有没有办法跳过链中的一个包?我看过“InstallCondition”并有这样的代码。 但我不想在 InstallConditi
我想知道如何将复选框值存储在变量中?我正在使用带有自定义 RtfTheme 的 WiX Burn。 例如: RtfTheme.xml Please select this box Bundle.wxs
所以我有一个非常简单的刻录安装程序,主要包括 .net 升级,或者偶尔包括我们的应用程序需要与之通信的硬件的驱动程序包。 我们创建的 MSI 支持升级或降级。
我正在尝试为 WiX 创建自定义 UI和燃烧。我遵循了我发现的一些指南,到目前为止,我有一个项目具有以下内容,它继承自 BootstrapperApplication。 namespace MyBA
有没有办法在安装程序中更改那张红色的 CD 图片? 这是 Burn 项目的代码: 谢谢! 最佳答案 是的,您可以使用自定义
我正在开发一个 Burn Bootstrap 应用程序,其目的是安装许多 MSI 包。我想测试其中一个软件包安装失败的场景。有没有办法创建一个 MSI 包,当您尝试安装它时总是失败? 最佳答案 是的,
我正在使用 exePackage 属性下载一个 exe 包 - 实际上是来自微软的 VSTO 运行时。 它无法获取包。 我相信这是将其添加到 CHAIN 的正确方法 =v10.0.40303)
我有一个自定义的刻录 bootstrap 应用程序,本地化为德语 (BurnUI_de-DE.wxl) 和英语 (BURNUI_en-US.wxl)。目前刻录自动以英文启动。我不知道如何在运行时更改
我有一个 WiX Burn使用 ManagedBootstrapperApplicationHost 的自定义安装程序。安装必备 Microsoft Windows Installer 之一后4.5
我创建了一个 WIX Burn Bundle。在捆绑包中,我安装了 .Net 4(如果未安装),然后再安装 2 个 .msi 文件。 1 是第三部分 msi,另一个是我使用 WIX 为我的软件创建的
有可能以某种方式拆开捆包吗?我需要确保捆绑包中的所有软件包均已正确签名... TIA 最佳答案 Dark.exe反编译包;使用-x提取位。 关于wix - 打开WIX Burn bundle ,我们在
假设这样定义 #define myDate [NSDate date] 每次我使用它时,它都会给我当前日期,没关系。 我想要的是存储代码编译的日期。我可以使用定义或使用任何其他方式来做到这一点吗? 我
我有一个 UIImageView 我正在尝试为类似 Ken Burns 的平移/缩放设置动画。我想开始以脸部为中心(具体来说,比如说,人的 Nose 末端)并缩小到图像的完整尺寸。代码是这样的: im
我正在构建一个将用作信息监视器的非公开网络应用程序。因此,它将在一台液晶电视显示屏上全天候 24/7 运行。 因为这可能会在 LCD 上产生“烙印颜色”错误,所以我正在寻找可以防止/减少此问题的 Ja
通常在Bundle.wxs 文件中设置EXE 版本。是否可以在编写安装程序后端引擎逻辑的 Bootstrapper Application 项目中获取此版本?我使用 WPF 创建了一个自定义 UI。我
我有一个由供应商提供给我的第三方 MSI。然而,MSI 不是独立的,它需要多个支持文件(dll、配置文件、设备驱动程序...)才能完成安装。我尝试在 MSI 目录中不存在这些文件的情况下进行安装,并且
我已经使用 WiX/Burn 编写了一个自定义托管 Bootstrap 应用程序,现在我正在尝试扩展它以处理 ExecuteFilesInUse 事件。我已经成功触发了事件并完成了我所得到的转储,这让
我为我们的一款产品创建了一个 WIX msi,效果非常好。该产品是一个 Word 插件,在升级/卸载时,msi 会自动检查 Word 是否打开(即我的程序集当前被锁定在执行中),如果是,则会显示“正在
我是Wix Burn Bootstrapper的新手,请原谅我的无知。我有一个要求,我需要使用Burn Bootstrapper安装必备组件。 前提条件是setup.exe(第三方),它依赖于文件和文
我是一名优秀的程序员,十分优秀!