我需要创建一个设置来启动自定义操作,以配置一些SQL内容。
这是我的序列:
<InstallExecuteSequence>
<Custom Action='StartCustomAction' After='InstallFinalize'>NOT Installed</Custom>
</InstallExecuteSequence>
我在这里调用自定义操作:
<Fragment>
<Binary Id="CustomActionBinary" SourceFile="$(var.InfPro.dotigaRuntimeSetup.CustomActions.TargetDir)$(var.InfPro.dotigaRuntimeSetup.CustomActions.TargetName).CA.dll"/>
<CustomAction Id="StartCustomAction" BinaryKey="CustomActionBinary" DllEntry="ShowInitialForm" Execute="immediate" Return="check"/>
</Fragment>
这是我的自定义操作:
[CustomAction]
public static ActionResult ShowInitialForm(Session session)
{
int i = Convert.ToInt32(session["UILevel"]);
if (i == 2)
{
StreamWriter file = new StreamWriter("c:\test.txt");
file.WriteLine("Test");
file.Close();
}
else {
InitialForm f = new InitialForm();
if (f.ShowDialog() == DialogResult.Cancel)
return ActionResult.UserExit;
}
return ActionResult.Success;
}
重要部分是if-block。出于测试目的,我想创建一个文件并编写&#34;测试&#34;在安装程序静默执行时。 据微软称,UILevel属性应为2. https://msdn.microsoft.com/en-us/library/windows/desktop/aa372096(v=vs.85).aspx
不幸的是没有发生。我甚至不知道自定义操作是否被调用。
我访问了http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html,看到你可以使用DllEntry =&#34; WixSilentExec&#34;在自定义操作标记中,但据我所知,DLL条目是自定义操作方法的名称。在我的例子中ShowInitialForm。
感谢您的帮助。 ;)
答案 0 :(得分:1)
感谢您的所有帮助,但解决方案完全按照其他方式进行。我使用以下命令在安静模式下调用我的设置:
msiexec /i mySetup.msi /l*v myLog.log
日志长达1700行,偶然我发现导致设置失败的错误是错误1925,这意味着&#34;您没有足够的权限来为机器的所有用户完成此安装。以管理员身份登录,然后重试此安装。&#34;
所以我通过命令行以管理员身份启动了设置,一切正常。
答案 1 :(得分:0)
您可以参考 二进制 元素中的(您的自定义操作项目).CA.dll 。您应该参考(您的自定义操作项目).dll 。
根据您的自定义操作展示位置,它应该是延迟类型CA,但您使用的是直接类型CA.此时不会立即调用直接CA.将您的操作类型更改为延迟。请注意,延迟操作无法访问会话变量。这样做是为了将数据传递给您的CA:
<CustomAction Id="SetProperty.StartCustomAction" Property="StartCustomAction" Value="UILevel=[UILevel]" />
<CustomAction Id="StartCustomAction" BinaryKey="CustomActionBinary" DllEntry="ShowInitialForm" Execute="deferred" />
SetProperty.StartCustomAction CA应定义为在执行顺序 StartCustomAction 之前调用:
<Custom Action='SetProperty.StartCustomAction' After='InstallFinalize'>NOT Installed</Custom>
<Custom Action='StartCustomAction' After='SetProperty.StartCustomAction'>NOT Installed</Custom>
在您的操作代码中使用此代码来访问传递的值:
session.CustomActionData["UILevel"]
使用PhilDW建议并始终使用日志输出运行。使用这样的代码写入以记录您的调试输出:
session.Log("Begin ShowInitialForm CustomAction");
希望这有帮助。
答案 2 :(得分:0)
使用命令行msiexec / I [msi的路径] / l * vx [文本日志文件的路径]安装,以查看发生了什么。它将显示UILevel属性的值。此外,日志将告诉您安装是否尝试完全调用您的Dll。 session.log调用作为代码中的第一件事将告诉您代码是否已启动(您的文本将出现在该MSI日志中)。根据需要执行尽可能多的session.log调用,以查看它是否失败以及失败的位置。
你不能认为它找不到Dll,因为问题可能是缺少依赖的Dll。您在显示Dll时发布的png文件 - 目前尚不清楚要显示的内容。 Dll位于MSI文件的二进制表中,并将流式传输到将被调用的某个位置,因此根据定义,它们不会丢失。二进制表中的Dll未被“安装”以被称为CA - 它们被流式传输,调用,然后被移除。 png文件显示临时位置并不明显。在调用托管代码自定义操作的WiX / DTF方法中有一些分层,也许你看错了地方。
希望您的对话框能够在WiX / DTF托管代码自定义操作体系结构中运行,因为您需要位于具有功能消息循环的STA窗口线程中。从架构上讲,这些数据应该在开始时在UI中收集,如果UI被抑制,那么在UI中设置的属性值可以通过msiexec命令行传递,因此安装仍然可以完成所有操作(并且您需要没有UILevel检查)。另一个常见的替代方法是在第一次使用应用程序时运行该程序,因为您正在运行一个普通的,可调试UI的可测试程序。作为另一种选择,只需将实际程序作为exe自定义操作运行,这也是一个普通的UI程序,可测试,可调试等。