WiX安装程序在静音和"静音"中启动相同的自定义动作;正常的";模式

本文关键字:quot 自定义 模式 静音 程序 安装 WiX 启动 | 更新日期: 2023-09-27 18:00:59

我需要创建一个设置来启动一个自定义操作,该操作配置一些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块。出于测试目的,我想创建一个文件,并在安装程序静默执行时在其中写入"Test"。根据Microsoft的说法,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="WixSilentExec",但据我所知,DLL条目是您自定义操作方法的名称。在我的情况下显示InitialForm。

谢谢你的帮助。(

WiX安装程序在静音和"静音"中启动相同的自定义动作;正常的";模式

感谢您的帮助,但解决方案完全相反。我使用以下命令在安静模式下调用了我的设置:

msiexec /i mySetup.msi /l*v myLog.log 

日志长达1700行,我偶然发现导致安装失败的错误是错误1925,这意味着"您没有足够的权限为机器的所有用户完成此安装。以管理员身份登录,然后重试此安装。">

所以我通过命令行以管理员身份启动了设置,一切都很好。

您可以参考(您的自定义操作项目(。Binary元素中的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" />

设置属性。StartCustomActionCA应定义为在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");

希望这能有所帮助。

使用命令行msiexec/I[path to msi]/l*vx[path to text log file]进行安装,查看发生了什么。它将显示UILevel属性的值。此外,日志会告诉您安装程序是否试图调用您的Dll。代码中的第一件事是session.log调用,它会告诉您代码是否启动(您的文本将显示在MSI日志中(。根据需要执行尽可能多的session.log调用,以查看它是否以及在哪里失败。

您不能认为它找不到Dll,因为问题可能是缺少依赖Dll。你发布的带有Dlls的png文件-不清楚它要显示什么。Dlls在MSI文件的二进制表中,并将流式传输到调用它们的某个位置,因此根据定义,它们不能丢失。二进制表中的DLL并不是"安装"为CA调用的——它们是流式输出、调用然后删除的。png文件显示的临时位置并不明显。WiX/DTF方法调用托管代码自定义操作时存在一些分层,可能您找错地方了。

希望您的对话框能在WiX/DTF托管代码自定义操作架构中工作,因为您需要在具有功能性消息循环的STA窗口线程中。从体系结构上讲,这些数据应该在一开始就在UI中收集,如果UI被抑制,那么可以通过msiexec命令行传递在UI中设置的属性值,这样安装仍然可以完成所有操作(并且不需要UILevel检查(。另一种常见的选择是在第一次使用该应用程序时运行该程序,因为此时您正在运行一个正常的、UI可调试的、可测试的程序。作为另一种选择,只需运行一个实际的程序作为exe自定义操作,这也是一个正常的UI程序,可测试、可调试等。