在WiX中安装期间创建临时文件夹

时间:2014-01-24 11:36:37

标签: c# wix installation custom-action dtf

在WiX中,如何在目标机器上创建临时隐藏文件夹(如IS中的SUPPORTDIR),在安装过程中以及如何将文件添加到它,存储在二进制表中,然后在安装后删除它在wix完成?

感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个示例解决方案,扩展了我在自己的评论中引用的the idea

简而言之,您不必通过向二进制表添加额外文件来使解决方案复杂化,在自定义操作中提取它们并在之后删除。 DTF自定义操作的内置机制可以为您完成。

假设您有一个XML文件,您希望在自定义操作中读取以将某些信息输出到安装日志文件。首先,您应该在VS中创建一个自定义操作项目(文件 - >新建 - >项目...并选择" C#自定义操作项目"模板)。

然后,添加XML文件作为内容:在解决方案资源管理器中右键单击项目,选择添加 - > New Item ...并选择XML文件。我们称之为data.xml。内容可能如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<settings>
  <setting name="a" value="one" />
  <setting name="b" value="two" />
</settings>

接下来,添加一些代码来读取此XML中的值并将某些内容写入安装日志(请记住,它只是一个示例):

[CustomAction]
public static ActionResult ReadXml(Session session)
{
  var doc = XDocument.Load("data.xml");
  var settings = from setting in doc.Descendants("setting")
                 select new
                 {
                   Name = setting.Attribute("name").Value,
                   Value = setting.Attribute("value").Value
                 };

  foreach (var setting in settings)
  {
    session.Log(string.Format("{0} = {1}", setting.Name, setting.Value));
  }

  return ActionResult.Success;
}

请注意,我将XML文件引用为data.xml - 当自定义操作运行时,它将在运行它的同一目录中找到该文件。

最后,将自定义操作添加到安装过程中:

<Binary Id="MainBinary" SourceFile="bin\ExtraFiles.CA.dll" />
<CustomAction Id="ReadXmlCA" BinaryKey="MainBinary" DllEntry="ReadXml" Execute="deferred" />

<InstallExecuteSequence>
  <Custom Action="ReadXmlCA" After="InstallFiles" />
</InstallExecuteSequence>

现在,构建MSI包并按以下方式运行安装:

msiexec -i SupportDir.msi /l*v install.log

程序包安装完成后,打开install.log文件并搜索CustomActions.ReadXml。你会看到这样的事情:

SFXCA: Extracting custom action to temporary directory: C:\Windows\Installer\MSIAB8D.tmp-\
SFXCA: Binding to CLR version v4.0.30319
Calling custom action ExtraFiles!ExtraFiles.CustomActions.ReadXml
a = one
b = two

显然,自定义操作已完成其工作:它读取XML文件内容并将正确的信息输出到日志文件。还有一点需要注意:临时目录路径。尝试导航到该目录 - 您将发现它是空的。

这意味着DTF会将文件提取到适当的位置以使其可用于自定义操作代码,并在作业完成后进行清理。

希望此概述有助于理解其工作方式。