Wix:我可以用自定义动作走多远?

时间:2013-07-31 19:39:36

标签: c# wix windows-installer

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

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

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

1)使用c#?

运行另一个dll调用

2)从网上下载文件并解析它(假设 - 也使用c#)?

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

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

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

3 个答案:

答案 0 :(得分:5)

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

您应谨慎使用自定义操作。正确设计的自定义操作应该像Windows Installer中内置的标准操作一样。这是支持事务安装,并通过自定义表进行数据驱动。

你所描述的需要完成的东西的一个更好的候选者可能是一个引导程序/ chainer,如WiX的Burn功能。

答案 1 :(得分:2)

1) - 绝对是的

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

答案 2 :(得分:1)

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

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

3)当然

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

5)是的,确定。最简单的方法是向您的msi添加一个Upgrade表,只需卸载任何具有此升级代码的软件即可。这是唯一允许同时执行两个msis的操作。查看RemoveExistingProducts操作的InstallExecute Sequence表。