3

我想构建一个 Wix 安装程序,它将检测我的一些程序并更新它们。

我有 c# 代码(使用另一个 DLL)来检查系统上的一些东西,然后我想下载所有应用程序的最新版本的表格,决定我需要更新哪个应用程序,然后下载并更新所选那些。

所以我的问题是,Wix 可以执行以下操作:

1)使用 c# 运行另一个 dll 调用?

2)从网上下载一个文件并解析它(比方说-也使用c#)?

3)转到链接并下载 MSI\EXE?

4)安装 MSI\EXE (假设在静音模式下运行)?

5)从系统中卸载旧的其他应用程序?

4

3 回答 3

5

Windows Installer 有一个互斥锁,它只允许每台机器 1 个执行序列和每个进程 1 个 UI 序列。由于此限制,一个 MSI 无法安装另一个 MSI。这方面有一些技巧,但它们没有遵循良好的设计(不提供适当的高度支持或静默安装/卸载支持)。

您应该谨慎使用自定义操作。正确设计的自定义操作的行为应类似于 Windows Installer 中内置的标准操作。那就是尽可能支持事务安装,并通过自定义表进行数据驱动。

对于您所描述的需要完成的事情,一个更好的候选者可能是引导程序/链接程序,例如 WiX 的刻录功能。

于 2013-07-31T20:34:03.590 回答
2

1) - 绝对是的

2)-5) 你可以这样做,但你应该将 msi 与“自定义引导程序”和“安装配置管理器后自定义”区分开来。一般规则:仅将 msi 包用于资源(通常是文件;在更复杂的情况下 - 注册表,大多数情况下是 sql 对象)原子部署;将所有其他功能移到 msi 之外(意味着使用 wix on 构建 msi;为引导程序和配置工具创建自定义实用程序;请参阅 wix 示例如何将三个部分集成在一起)。

于 2013-07-31T20:34:26.710 回答
1

1) 是的,但请记住,如果您依赖 .NET 3.5 并且您使用的是 .NET 4 的盒子,您的自定义操作将无法运行。除此之外,您的自定义操作 dll 从 msi 解压缩到 %TEMP% 文件夹中。如果您对未存储在 GAC 中的其他 dll 有任何依赖关系,您将无法加载。如果您引入另一个例如 C++ dll,您必须将其作为资源嵌入到您的 C# dll 中并解压缩以找到它。

2)你可以做任何你有权利做的事。

3) 当然

4) 一次只能运行一个 MSI 安装。您必须生成一些子进程才能等到当前安装结束。

5) 是的,当然。最简单的方法是将升级表添加到您的 msi,以简单地卸载具有此升级代码的任何软件。这是唯一允许同时激活两个 msis 的操作。查看RemoveExistingProducts操作的 InstallExecute Sequence 表。

于 2013-07-31T20:34:18.130 回答