Windows installer Installshield/MSI在卸载过程中安装临时文件

Windows installer Installshield/MSI在卸载过程中安装临时文件,windows-installer,installshield,Windows Installer,Installshield,我有一个运行自定义操作的安装项目。自定义操作本身使用一些临时文件,这些文件在调用自定义操作之前由安装程序复制。自定义操作完成后,将删除这些文件 在安装阶段,一切正常 我的问题是在卸载阶段。另一个自定义操作被调用,它还需要访问这些临时文件。我的问题是在卸载阶段如何(临时)复制计算机上的文件? 提前感谢。Windows Installer不支持临时文件。因此,我假设您只是安装一些文件,并在安装结束时删除它们。这不是一个好方法,因为对于Windows Installer来说,它们基本上缺少资源 临时文

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

在安装阶段,一切正常

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


提前感谢。

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

临时文件的正确方法是将它们存储在表中,并使用自定义操作,在安装开始时提取它们,在安装结束时删除它们。多个设置编写工具直接支持这一点

在您的情况下,您可以尝试以下方法:

  • 安装期间不要删除文件(将其保留在磁盘上)
  • 在InstallExecuteSequence中的操作之前计划卸载自定义操作

通过这种方式,卸载自定义操作将访问您的文件。

虽然Cosmin回答的肯定是正确的,但他似乎不知道InstallShield有一个名为Support files的功能,它已经完成了他所描述的一切。将一些文件拖动到Installation Designer | Behavior and Logic | Support files | Language Independent和InstallShield将自动将它们流式传输到ISSetupFile表中,并对自定义操作进行排序,以便在安装期间将文件提取到临时目录,并在最后清理文件

可以使用[SUPPORTDIR]属性找到这些文件的位置。如果您使用的是延迟的自定义操作,则必须通过CustomActionData属性序列化该操作


此外,如果您使用DTF自定义操作,您应该知道,如果您使用内容操作向CA CSPROJ添加内容并始终复制,则在代码执行时,内容将打包并提取到当前目录中以供访问。

谢谢Cosmin。现在,我将文件存储在二进制表中,并在运行其他自定义操作之前使用自定义操作提取它。我正在使用WIX DTF进行自定义操作。将二进制表中的内容存储在字符串中的代码如下所示:
string content=null;使用(View v=session.Database.OpenView(“SELECT
Data`FROM
Binary
WHERE
Name
='{0}',myResKey”){v.Execute();使用(Record r=v.Fetch()){using(Stream s=r.GetStream(1)){using(StreamReader rs=new StreamReader(s)){content=rs.ReadToEnd();}}}}True,但是InstallShield确实支持[SUPPORTFILES]的概念,我经常出于合法目的而需要它们,而不是您假设的反模式。谢谢Christopher。我不知道支持文件的功能;这是非常有用的。我知道在DTF自定义操作中打包文件,但这在我的场景中不起作用,因为要在安装程序包中部署的文件不同,而自定义操作则不同。