问题标签 [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.
c# - WiX DTF 以经典外观启动 Windows Installer
可以正常启动 Windows Installer,但使用经典外观。.msi 本身在独立启动时看起来没问题(它使用 WiX 自己提供的 UI)。怎么会被迫开始好看?
截屏:
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)?
c# - 在 WiX 中安装期间创建临时文件夹
在 WiX 中,如何在安装过程中在目标机器上创建一个临时隐藏文件夹(如 IS 中的 SUPPORTDIR)以及如何将文件添加到其中,这些文件存储在二进制表中,然后在安装完成后将其删除蜡?
感谢任何帮助。
谢谢。
wix - 从 WiX 部署工具基金会获取进度事件
如何使用 WiX 部署工具基础获取安装进度事件Microsoft.Deployment.WindowsInstaller.Installer.InstallProduct()
?
我不想要任何类型的 UI,只想要一个我可以处理的事件。我看到对InstallMessage
枚举的引用,它有一个Progress
成员,但我想看看它的用法示例。
installation - 只能从 VB.NET 读取/写入 21 个字符到 InstallShield 属性
我正在使用VB.NET和InstallShield中的自定义操作在安装期间更新某些属性。
只要我不尝试在属性中读取或写入超过 21 个字符,一切正常,在这种情况下它会崩溃。
为了清楚起见,如果我通过 IS 将这个字符串“123456789112345678921”输入到属性中,然后尝试从 VB.NET 读取它,一切正常。如果我添加另一个字符并阅读它,它会崩溃。写作是相似的——如果我写(来自VB.NET)上面的第一个字符串就可以了。如果我添加另一个字符,它会失败。
我怀疑我的 MsiSetProperty 和 MsiGetProperty 定义不正确:
这就是我访问字段的方式:
关于发生了什么的任何想法?
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 能够看到随产品安装的引用。
这些文件是:
c# - 从 .msi 读取平台信息
我正在使用这些Microsoft.Deployment.WindowsInstaller
库从 .msi 文件中读取值。属性没问题,也可以读出summary-information,例如:
该QDatabase
对象甚至有一个很好的SummaryInfo
属性,保存摘要信息。但是,我还没有找到如何获得 .MSI 所针对的平台。
似乎可以读出平台,因为 Orca 也这样做(在 Orca 中打开摘要信息时可以看到平台)。
如何获得 .msi 所针对的平台?
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?
wix - 使用自定义操作读取 MSI 的目录表
我有一个托管代码自定义操作,它使用以下代码读取自定义表。
当我尝试以相同的方式读取目录表时,这仍然有效
我明白了
Microsoft.Deployment.WindowsInstaller.dll 中出现“Microsoft.Deployment.WindowsInstaller.BadQuerySyntaxException”类型的异常。
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
更新:愚蠢的我,忘记了在事务模式下的“提交”——但现在它和直接模式下的一样,所以对问题没有真正的改变。