【问题标题】:Installshield/MSI Install temporary file during uninstall processInstallshield/MSI 在卸载过程中安装临时文件
【发布时间】:2011-11-18 06:26:56
【问题描述】:

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

在安装阶段一切正常。

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

提前致谢。

【问题讨论】:

    标签: windows-installer installshield


    【解决方案1】:

    虽然 Cosmin 的回答肯定是真的,但他似乎并不知道 InstallShield 有一个名为 Support Files 的功能,该功能已经完成了他所描述的一切。将一些文件拖入 Installation Designer |行为与逻辑 |支持文件 | Language Independent 和 InstallShield 会自动将它们流式传输到 ISSetupFile 表中,并在安装过程中将文件提取到临时目录并在最后清理文件的序列自定义操作。

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

    此外,如果您使用 DTF 自定义操作,您应该知道,如果您使用 Content and Copy Always 操作将内容添加到 CA CSPROJ,它将被打包并提取到当前目录以供访问,同时你的代码正在执行。

    【讨论】:

    • 谢谢克里斯托弗。我不知道支持文件功能;这非常有用。我知道在 DTF 自定义操作中打包文件,但这在我的场景中不起作用,因为要部署的文件因安装程序包而异,而自定义操作不会。
    【解决方案2】:

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

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

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

    • 不要在安装过程中删除文件(将它们留在磁盘上)
    • 在 InstallExecuteSequence 中的 RemoveFiles 操作之前安排您的卸载自定义操作

    这样,卸载自定义操作将可以访问您的文件。

    【讨论】:

    • 感谢科斯敏。我现在将文件存储在二进制表中,并在运行其他自定义操作之前使用自定义操作提取它。我正在使用 WIX DTF 进行自定义操作。将二进制表中的内容存储在字符串中的代码如下所示:string content = null; using (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(); } } } }`
    • 是的,但是 InstallShield 确实支持 [SUPPORTFILES] 的概念,而且我经常需要它们用于合法目的,而不是您假设的反模式。
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2018-04-14
    相关资源
    最近更新 更多