在WiX中,如何在安装过程中在目标计算机上创建一个临时的隐藏文件夹(如IS中的SUPPORTDIR),以及如何向其中添加存储在Binary表中的文件,然后在安装完成后删除该文件。威克斯?
感谢任何帮助。
谢谢。
最佳答案
这是一个示例解决方案,扩展了我在自己的注释中引用的the idea。
简而言之,您不必通过在二进制表中添加额外的文件,通过自定义操作提取它们并随后删除来使解决方案复杂化。 DTF自定义操作的内置机制可以为您完成此任务。
假设您要在自定义操作中读取XML文件,以将一些信息输出到安装日志文件。首先,您应该在VS中创建一个自定义操作项目(文件->新建->项目...,然后选择“ C#自定义操作项目”模板)。
然后,添加XML文件作为内容:在解决方案资源管理器中右键单击该项目,选择“添加”->“新建项...”,然后选择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会考虑将文件提取到正确的位置,以使其可用于自定义操作代码,并在完成工作后进行清理。
希望本概述有助于理解其工作方式。