问题标签 [dtf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
180 浏览

c# - WiX DTF 以经典外观启动 Windows Installer

可以正常启动 Windows Installer,但使用经典外观。.msi 本身在独立启动时看起来没问题(它使用 WiX 自己提供的 UI)。怎么会被迫开始好看?

截屏:

在此处输入图像描述

0 投票
1 回答
622 浏览

c# - 如何以编程方式确定/更改 Wix Bundle 的安装状态?

我有一个 Wix Managed Bootstrapper Application / bundle (burn) 安装程序。

在 C# 中,我需要使用捆绑包的 ProductCode 或 UpgradeCode 来确定该捆绑包的安装状态。我尝试使用 Wix 部署工具基础 (DTF) 库的Microsoft.Deployment.WindowsInstaller.ProductInstallation类,但它似乎不适用于捆绑包,仅适用于嵌入式包 (MSI):

我最终还需要尝试从相同的代码中卸载捆绑包。我计划使用 DTF 的Installer.ConfigureProduct静态方法,但它似乎也不适用于捆绑包,仅适用于产品,因为以下调用会引发ArgumentException消息“此操作仅对当前安装的产品有效”。即使安装了捆绑软件:

所以,我的问题是:

如何确定我的捆绑包的当前安装状态以及如何强制卸载,全部来自 C#(最好使用 DTF API)?

0 投票
1 回答
3193 浏览

c# - 在 WiX 中安装期间创建临时文件夹

在 WiX 中,如何在安装过程中在目标机器上创建一个临时隐藏文件夹(如 IS 中的 SUPPORTDIR)以及如何将文件添加到其中,这些文件存储在二进制表中,然后在安装完成后将其删除蜡?

感谢任何帮助。

谢谢。

0 投票
2 回答
418 浏览

wix - 从 WiX 部署工具基金会获取进度事件

如何使用 WiX 部署工具基础获取安装进度事件Microsoft.Deployment.WindowsInstaller.Installer.InstallProduct()

我不想要任何类型的 UI,只想要一个我可以处理的事件。我看到对InstallMessage枚举的引用,它有一个Progress成员,但我想看看它的用法示例。

0 投票
2 回答
218 浏览

installation - 只能从 VB.NET 读取/写入 21 个字符到 InstallShield 属性

我正在使用VB.NETInstallShield中的自定义操作在安装期间更新某些属性。

只要我不尝试在属性中读取或写入超过 21 个字符,一切正常,在这种情况下它会崩溃。

为了清楚起见,如果我通过 IS 将这个字符串“123456789112345678921”输入到属性中,然后尝试从 VB.NET 读取它,一切正常。如果我添加另一个字符并阅读它,它会崩溃。写作是相似的——如果我写(来自VB.NET)上面的第一个字符串就可以了。如果我添加另一个字符,它会失败。

我怀疑我的 MsiSetProperty 和 MsiGetProperty 定义不正确:

这就是我访问字段的方式:

关于发生了什么的任何想法?

0 投票
2 回答
827 浏览

wix - DTF 正在复制自定义操作 dll 文件

我有在 installshield 中创建的 msi 设置,我正在执行 DTF 自定义操作 dll 作为提交自定义操作。如果我将 MessageBox.Show 插入到自定义操作中,我可以看到 [PROGRAMFILESDIR] 中有一个名为“CustomActionProject.CA.dll-”的临时文件夹,并且复制了 CustomActionProject.CA.dll 及其所有引用。

有没有办法告诉技术不要创建这个临时文件夹并在 .CA.dll 所在的同一文件夹中提取 + 执行 CustomActionProject.CA.dll?

编辑:

我发现我无法通过配置 wix.ca.targets 将引用包含在 .CA.dll 中。在我的情况下,这可以防止 .CA.dll 包含 20MB 的 dll。

现在我想确保 CustomActionProject.dll 能够看到随产品安装的引用。

这些文件是:

0 投票
1 回答
1294 浏览

c# - 从 .msi 读取平台信息

我正在使用这些Microsoft.Deployment.WindowsInstaller库从 .msi 文件中读取值。属性没问题,也可以读出summary-information,例如:

QDatabase对象甚至有一个很好的SummaryInfo属性,保存摘要信息。但是,我还没有找到如何获得 .MSI 所针对的平台。

似乎可以读出平台,因为 Orca 也这样做(在 Orca 中打开摘要信息时可以看到平台)。

如何获得 .msi 所针对的平台?

0 投票
1 回答
666 浏览

string - How to localize Error Messages for a Custom Action in wix and DTF?

I have written a custom action in DTF and would like to generate localized error messages for it. Until now, I have gone about this the following way: The custom action includes a method which displays a message that has been defined in the string table like this:

To make use of this error message, an Error element has to be created under the UI element like this:

The actual error message can then be stored in the localization variable Error42042 like this:

This approach works quite well although it has one serious limitation: It won't replace properties in the strings. So the string

will be displayed verbatim as [MY_PROPERTY] is broken.

Am I required to extend my getError method to substitute properties manually (i.e. with the help of regular expressions or some other text substitution technique)?

Is there a predefined function in the wix source code I could use for property substitution?

Is this the wrong approach altogether?

I have seen strings in the form of

in other installation packages. Being able to pass parameters to the String table like this would also be a feasible approach to tackle this problem, but I have not figured out how to pass parameters to the string table. Do you know how to do that?

0 投票
1 回答
488 浏览

wix - 使用自定义操作读取 MSI 的目录表

我有一个托管代码自定义操作,它使用以下代码读取自定义表。

当我尝试以相同的方式读取目录表时,这仍然有效

我明白了

Microsoft.Deployment.WindowsInstaller.dll 中出现“Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException”类型的异常。

0 投票
1 回答
842 浏览

c# - 使用 DTF (wix) 以编程方式将cabinet文件添加到msi

手头任务简介: 不耐烦可跳过

我工作的公司不是软件公司,而是专注于机械和热力学工程问题。为了帮助解决他们的系统设计挑战,他们开发了一个软件来计算更换单个组件对系统的影响。该软件相当陈旧,是用 FORTRAN 编写的,并且已经发展了 30 年,这意味着我们无法快速重写或更新它。

正如您可能想象的那样,该软件的安装方式也发生了变化,但比系统的其他部分慢得多,这意味着打包是通过一个批处理脚本完成的,该脚本从不同的地方收集文件,并将它们放在一个文件夹中,然后编译成iso,刻录成CD,并随邮件一起发送。

你们年轻的程序员(我 30 岁)可能希望程序加载 dll,但链接后会相当独立。即使代码由多个类组成,来自不同的命名空间等。

然而,在 FORTRAN 70 中.. 不是那么多。这意味着它本身的软件包含对预建模块的数量惊人的调用(阅读:单独的程序)..

我们需要能够通过互联网进行分发,就像任何其他现代公司在一段时间内都能够做到的那样。为此,我们可以让 *.iso 可下载,对吗?

好吧,很遗憾没有,iso 包含几个特定于用户的文件。正如您可能想象的那样,有数千个用户,这将是数千个几乎相同的 iso。

此外,我们不想将基于 FORTRAN 的旧安装软件转换为真正的安装包,我们所有其他(和更现代的)程序都是打包为 MSI 的 C# 程序。但是使用这个旧软件的单个 msi 的编译时间在我们的服务器上,接近 10 秒,因此当用户请求时,我们根本无法构建 msi。(如果多个用户同时请求,服务器将无法在请求超时之前完成..)我们也不能预先构建用户特定的 msi 并缓存它们,因为我们会耗尽服务器上的内存..(每个已发布版本总计约 15 GB)

任务描述 tl:dr;

这是我想做的事情:(灵感来自Christopher Painter的评论)

  • 使用虚拟文件而不是用户特定文件创建基本 MSI
  • 为每个用户创建 cab 文件,其中包含用户特定的文件
  • 在请求时,使用“_Stream”将用户特定的 cab 文件注入到基本 msi 的临时副本中。
  • 使用与额外文件相对应的新“DiskID”和“LastSequence”以及注入的 cabfile 的名称将引用插入到 Media 表中。
  • 使用新 cab 文件中用户特定文件的名称、新序列号(在新 cab 文件序列范围内)和文件大小更新 Filetable。

问题

我的代码无法完成刚才描述的任务。我可以很好地从 msi 中读取,但永远不会插入cabinet 文件。

还:

如果我用 DIRECT 模式打开 msi,它会破坏媒体表,如果我在 TRANSACTION 模式下打开它,它根本无法改变任何东西..

在直接模式下,Media 表中的现有行被替换为:

我究竟做错了什么 ?

下面我提供了与注入新 cab 文件有关的片段。

片段 1

片段 2

片段 3

更新:愚蠢的我,忘记了在事务模式下的“提交”——但现在它和直接模式下的一样,所以对问题没有真正的改变。