2011-09-15 130 views
2

我有一个运行自定义操作的安装项目。自定义操作本身使用临时文件,这些文件在调用自定义操作之前由安装程序复制。自定义操作完成后,这些文件将被删除。Installshield/MSI在卸载过程中安装临时文件

在安装阶段一切正常。

我的问题是在卸载阶段。另一个自定义操作被调用,它也需要访问这些临时文件。我的问题是如何在卸载阶段在机器上复制文件(暂时)?

在此先感谢。

回答

1

Windows Installer不支持临时文件。所以我假设你只是安装一些文件并在安装结束时删除它们。这不是一个好方法,因为对于Windows Installer他们基本上缺少资源。

临时文件正确的做法是将它们存储在Binary表,并把它提取出来的安装开始时和当它结束时删除自定义操作。这由多个设置创作工具直接支持。

你的情况,你可以试试这个方法:

  • 没有删除安装文件(让它们在磁盘上)
  • RemoveFiles行动安排您卸载自定义操作中InstallExecuteSequence
期间

这种方式卸载自定义操作将有权访问您的文件。

+0

谢谢科斯明。我现在将文件存储在二进制表中,并在运行其他自定义操作之前使用自定义操作将其解压缩。我正在使用WIX DTF进行自定义操作。用于存储二进制表中字符串内容的代码如下所示: 'string content = null; 使用(视图v = session.Database.OpenView( “选择'Data' FROM'Binary' WHERE'Name' = '{0}'”, “myResKey”)) { v.Execute(); (记录r = v.Fetch()) { 使用(流s = r。GetStream(1)) 使用(StreamReader rs = new StreamReader(s)) { content = rs.ReadToEnd(); } } } }' –

+0

确实如此,但InstallShield确实支持[SUPPORTFILES]的概念,并且我经常需要它们来达到合法目的,而不是您假设的反模式。 –

3

虽然什么科斯明已回答必须是真实的,他似乎并不知道的InstallShield有一个叫做支持文件的功能,已经这样做了,他描述的一切。将一些文件拖入安装设计器|行为和逻辑|支持文件|独立于语言并且InstallShield将自动将它们流式传输到ISSetupFile表中,并对在安装过程中将文件解压缩到临时目录并在最后清理文件的自定义操作进行排序。

这些文件的位置可以使用[SUPPORTDIR]属性中找到。如果您使用的是延迟自定义操作,那么您将通过CustomActionData属性对此进行序列化。

此外,如果您使用的是DTF自定义操作,则应该意识到,如果通过内容和复制的操作将内容添加到CA CSPROJ,则会将其打包并提取到当前要访问的目录而你的代码正在执行。

+0

谢谢克里斯托弗。我不知道支持文件功能;这非常有用。我知道在DTF自定义操作中打包文件,但这在我的方案中不起作用,因为要部署的文件因安装程序包而异,而自定义操作则不同。 –

相关问题