一种解决方案是创建一个立即执行的自定义操作来检查文件是否存在。如果是这样,请设置一个属性并在您的初始化自定义操作的条件中使用该属性。
在下面的 C# 托管自定义操作示例中,它采用“SOMEPROPERTY”的值,如果存在相应的目录,则设置属性 RUNINITDB=1。然后,您可以在初始化自定义操作的条件下使用 RUNINITDB。如果属性 RUNINITDB 存在,则运行您的自定义操作。
[CustomAction]
public static ActionResult CheckInitDb(Session session)
{
session.Log("Begin CheckInitDb");
string dir = session["SOMEPROPERTY"]; //or you could figure this out programmatically
if(!Directory.Exists(dir))
{
session["RUNINITDB"] = "1";
session.Log("Setting RUNINITDB bit.");
}
return ActionResult.Success;
}
要创建上面的自定义操作项目,请创建一个新的 Visual Studio 项目并在 Windows Installer XML 模板下,选择 C# Custom Action Project。
要在安装程序 XML 源代码中引用自定义操作,假设自定义操作位于名为 InstallHelper.CA.dll 的 dll 中,您可能会遇到类似于以下代码的内容。请注意,仅当设置了属性 RUNINITDB 时,自定义操作 CallToRunInitDB 才会运行。
<Binary Id="InstallHelper" SourceFile="InstallHelper.CA.dll"/>
<CustomAction Id="CheckInitDb" BinaryKey="InstallHelper" DllEntry="CheckInitDb" Execute="immediate" Return="check"/>
<InstallExecuteSequence>
<Custom Action="CheckInitDb" Before="InstallInitialize">NOT (REMOVE ~= "ALL")</Custom>
<Custom Action="YourCallToRunInitDB" After="InstallInitialize">RUNINITDB</Custom>
</InstallExecuteSequence>
如果您不熟悉 WiX 托管的自定义操作,您可以在 SO 上找到一些其他示例代码:https ://stackoverflow.com/search?q=wix+managed+custom+action