【发布时间】:2011-11-18 06:26:56
【问题描述】:
我有一个运行自定义操作的安装项目。自定义操作本身使用安装程序在调用自定义操作之前复制的一些临时文件。自定义操作完成后,文件将被删除。
在安装阶段一切正常。
我的问题是在卸载阶段。另一个自定义操作被调用,它也需要访问这些临时文件。我的问题是如何在卸载阶段(临时)在机器上复制文件?
提前致谢。
【问题讨论】:
标签: windows-installer installshield
我有一个运行自定义操作的安装项目。自定义操作本身使用安装程序在调用自定义操作之前复制的一些临时文件。自定义操作完成后,文件将被删除。
在安装阶段一切正常。
我的问题是在卸载阶段。另一个自定义操作被调用,它也需要访问这些临时文件。我的问题是如何在卸载阶段(临时)在机器上复制文件?
提前致谢。
【问题讨论】:
标签: windows-installer installshield
虽然 Cosmin 的回答肯定是真的,但他似乎并不知道 InstallShield 有一个名为 Support Files 的功能,该功能已经完成了他所描述的一切。将一些文件拖入 Installation Designer |行为与逻辑 |支持文件 | Language Independent 和 InstallShield 会自动将它们流式传输到 ISSetupFile 表中,并在安装过程中将文件提取到临时目录并在最后清理文件的序列自定义操作。
可以使用 [SUPPORTDIR] 属性找到这些文件的位置。如果您使用的是延迟自定义操作,那么您将通过 CustomActionData 属性对其进行序列化。
此外,如果您使用 DTF 自定义操作,您应该知道,如果您使用 Content and Copy Always 操作将内容添加到 CA CSPROJ,它将被打包并提取到当前目录以供访问,同时你的代码正在执行。
【讨论】:
Windows Installer 不支持临时文件。所以我假设您只是安装一些文件并在安装结束时删除它们。这不是一个好方法,因为对于 Windows Installer,它们基本上缺少资源。
临时文件的正确方法是将它们存储在Binary 表中,并使用自定义操作在安装开始时提取它们并在安装结束时删除它们。多个设置创作工具直接支持这一点。
在您的情况下,您可以尝试这种方法:
这样,卸载自定义操作将可以访问您的文件。
【讨论】:
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(); } } } }`