我结束了使用CustomAction方法。希望这可以帮助别人
请记住:
- 我使用单选按钮并将选择存储在CONFIGURATIONSELECTION变量中。
- 我使用自定义操作,允许用户通过文件选择对话框选择文件,并将返回的结果存储在FILEPATH变量中。
首先,照顾变量定义的:
<Product>
...
<Property Id="CONFIGURATIONSELECTION" Value="1" Secure="yes"/>
<Property Id="FILEPATH" Admin="yes" Secure="yes" />
...
</Product>
然后定义CustomAction:
<Product>
...
<Binary Id="CustomActions.CA" SourceFile="..\CustomActions\bin\
$(var.Configuration)\CustomActions.CA.dll" />
<CustomAction Id="CopyStartupConfig" Return="check" Execute="deferred"
BinaryKey="CustomActions.CA" DllEntry="CopyStartupConfig" />
...
</Product>
最后,注意安装序列。这可以确保在最后完成该操作,并且该产品以前未安装,第二个单选按钮已被选中,并且该文件实际已被选中。请注意,在这个阶段技术上不需要文件路径检查,因为我在我的Next按钮上进行了验证,除非已经填充了包含配置文件的文本框,否则不允许我单击Next按钮。
<InstallExecuteSequence>
<Custom Action="CopyStartupConfig" Before="InstallFinalize">
<![CDATA[NOT Installed AND CONFIGURATIONSELECTION = 2 AND FILEPATH <> ""]]>
</Custom>
</InstallExecuteSequence>
...
至于自定义操作本身,它是一个简单的复制文件:
[CustomAction]
public static ActionResult CopyStartupConfig(Session session)
{
session.Log("CopyStartupConfig");
try
{
string sourceFilename = session.CustomActionData["STARTUPCONFIG"];
string targetFilename = Path.Combine(session.CustomActionData["APPLICATIONFOLDER"], Path.GetFileName(session.CustomActionData["STARTUPCONFIG"]));
session.Log("SourceFileName: " + sourceFilename);
session.Log("TargetFilename: " + targetFilename);
session.Log("About to copy " + sourceFilename + " to " + targetFilename);
File.Copy(sourceFilename, targetFilename);
session.Log(sourceFilename + " copied successfully.");
return ActionResult.Success;
}
catch (Exception ex)
{
session.Log("An unhandled exception has occured in CopyStartupConfig: " + ex.ToString());
return ActionResult.Failure;
}
}
记住,这样做是因为被应用在InstallFinalize
条件和两个变量已经设定的一种方式或其他,我打电话给我的自定义对话框,其中包括单选按钮,文件选择等...
上述似乎工作,但我显然必须花更多的时间来测试它,我也必须照顾在发生卸载时删除配置文件的习惯,我必须确保这一点如果调用修理或更改,则不会发生任何事情。
更新:我最初删除了我的答案,因为我注意到它实际上并没有工作,并且我错过了将参数传递给我的自定义操作的关键部分。我认为这是自动完成的,但似乎并非如此。
不管怎么说,进一步研究这个问题后,我发现这篇文章能够解释它很清楚:
Creating Custom Action for WIX Written in Managed Code without Votive
因此,这里是缺少的部分:
您需要包括你想要的变量在自定义操作中传递给自定义操作,并在每个值之间使用分号:
<CustomAction Id="SetCopyStartupConfigDataValue" Return="check"
Property="CopyStartupConfig" Value="APPLICATIONFOLDER=
[APPLICATIONFOLDER];STARTUPCONFIG=[FILEPATH]" />
现在,请务必在您InstallSequence这个自定义操作,并设置它被称为复制操作之前被触发:
<InstallExecuteSequence>
<Custom Action="SetCopyStartupConfigDataValue" Before="CopyStartupConfig">
NOT Installed</Custom>
<Custom Action="CopyStartupConfig" Before="InstallFinalize">
<![CDATA[NOT Installed AND CONFIGURATIONSELECTION = 2 AND FILEPATH <> ""]]>
</Custom>
</InstallExecuteSequence>
的最后一步是修改我的自定义操作。我更新了上面的代码,但总之,为了访问你已经通过的变量,你不想使用session["STARTUPCONFIG"]
,而是想要使用会话session.CustomActionData["STARTUPCONFIG"]
希望这有助于!
我发布了一个我认为是有效的答案,但我没有意识到,我愚蠢地将配置文件作为常规文件包含在我的安装中。一旦我将其删除,我建议的解决方案无法正常工作,因此请回到制图板! – Thierry 2014-09-24 11:54:38