【问题标题】:WIX: CustomAction can't find file after "InstallFiles"WIX:CustomAction 在“InstallFiles”之后找不到文件
【发布时间】:2020-02-29 18:28:06
【问题描述】:

我目前正在开发用于读取和写入 INI(C:\Windows 之外)和 XML 文件的 CustomAction 库。我已经看过this SO question,但建议的答案对我的问题没有帮助。我尝试执行的 CustomAction(用于从 INI 文件中读取值)定义为

<CustomAction Id="MyCustomAction" 
              Execute="deferred"
              Impersonate="no"
              Return="ignore"
              BinaryKey="MyCALibrary.CA.dll"
              DllEntry="MyCustomActionEntry" />

并安排为

<InstallExecuteSequence>
   <Custom Action="MyCustomAction" After="InstallFiles">
     <![CDATA[NOT Installed AND NOT PATCH]]>
   </Custom>
</InstallExecuteSequence>

由于是延迟动作,所以通过属性接收数据:

   <Property Id="MyCustomAction"
              Value="File=[INSTALLDIR]cfg\MyConfig.ini;Section=MyConfig;Key=MyKey"/>

我的 CustomAction 的 (C#) 实现如下所示:

    [CustomAction]
    public static ActionResult MyCustomActionEntry(Session session)
    {
      try
      {
        session.Log("Begin MyCustomActionEntry");
        CustomActionData data = session.CustomActionData;

        session.Log($"Data: '{data}'.");

        string fileName = data["File"];
        string sectionName = data["Section"];
        string keyName = data["Key"];

        // ... check if all properties are set
        // ... removed for brevity

        session.Log($"- Parametrization: (File={fileName}; Section={sectionName}; Key={keyName}.");

        if(File.Exists(fileName))
        {
          session.Log("File found on disk.");
        }
        else
        {
          session.Log("File NOT found on disk.");
        }

        // ... actual INI Access - F A I L S

      } 
      catch(Exception ex)
      {
        //... handle any errors
      }
    }

使用 Orca,我发现 CustomAction 很可能已正确安排 - 表 InstallExecuteSequence 显示:

...
InstallFiles   4000
...
MyCustomAction 4001
...

当然,我现在查看了安装日志以获取提示。日志显示: (我猜是 immediate 阶段):

Action ended <time>: InstallFiles. Return value 1.
MSI (s) (F8:98) <time>: Doing action: MyCustomAction
Action start <time>: MyCustomAction.
Action ended <time>: MyCustomAction. Return value 1.

对于我认为是 延迟 阶段(在日志中更下方):

MSI (s) (F8:98) <time>: Executing op: FileCopy(SourceName=qjlzmwkb.ini|MyConfig.ini,SourceCabKey=<key>,DestName=MyConfig.ini,...,InstallMode=58982400,...)
MSI (s) (F8:98) <time>: File: C:\tmp\MyApp\cfg\MyConfig.ini;    To be installed;    Won't patch;    No existing file
MSI (s) (F8:98) <time>: Source for file '<key>' is compressed
...
Begin MyCustomActionEntry
...
Data: 'File=C:\tmp\MyApp\cfg\MyConfig.ini;Section=MyConfig;Key=MyKey'.
...
- Parametrization: (File=C:\tmp\MyApp\cfg\MyConfig.ini; Section=MyConfig; Key=MyKey).
...
File NOT found on disk.

安装程序完成后,文件就在我预期的位置 - 自定义操作中引用的位置。

我假设在执行阶段的延迟阶段InstallFiles 之后安装的文件应该在磁盘上可用,以供任何 CustomAction 访问。 有没有其他人观察到类似的行为,可以给我提示我还能做什么?

【问题讨论】:

  • 我不禁注意到您传递的文件是一个 INI 文件。难道这个文件位于 IniFile 表而不是 File 表中?因此,您需要安排自定义操作在 WriteIniValues 而不是 InstallFiles 之后执行......
  • INI文件位于文件表中;要安装的文件也全部用热收集 - 使用HeatDirectory 元素。使用 Orca,我什至看不到 IniFile 表。
  • 您确定自定义操作延迟运行吗?您可以为此添加您的 WiX 标记以便我们查看吗?
  • 我不确定我是否完全理解。除了我的问题顶部的三个 sn-ps 之外,WiX 标记还有更多吗?

标签: wix windows-installer custom-action


【解决方案1】:

总结:您可以使用即时模式自定义操作从 INI 文件中读取值并设置 Windows 使用的属性 安装程序在常规安装期间以内置方式将值写入实际 INI 文件(无需自定义操作来写入任何内容,只需读取)。 Advanced Installer Sample Video(类似方法)。


自定义操作:关于自定义操作的一些事情:


INI:快速总结(据我所知):

  • INI 写入:INI 文件可以完全由 MSI 本身写入磁盘上的任何位置
    • 您可以使用属性注入自定义值:[MYPROPERTY]
    • IniFile table 负责所有这一切,并且工作正常
    • 不要将 INI 文件安装为单独的文件,请使用 IniFile 表。 More here
  • INI 读取:Windows Installer INI 值搜索支持 %SystemDrive%\Windows 文件夹 (@987654336 @)。
    • 换句话说:它只是从任何困难的地方读取值(除非这在我不知道的情况下发生了变化 - 我在这里和那里看到不同的黑客攻击)
    • 您可以使用即时模式自定义操作从 INI 文件中读取值,并设置 Windows Installer 用来将值写入实际 INI 文件的属性。
    • There is sample code here to read INI files with VBScript(只是要记住它就在那里,不建议这样使用)。
  • 视频示例高级安装程序See this video for how to do things with regards to INI files in Advanced Installermajor MSI tools available 之一)

XML:XML 写入和读取根本不是 MSI 的一部分(与 INI 写入不同)。所有主要工具都支持 XML 写入和读取,并且每个工具在外观上都略有不同。

如果可以的话,不建议在这里推出自己的功能 和已经存在的东西。

【讨论】:

  • 感谢您的详细回复。我已经调试了安装程序,并且能够观察到在执行我的 CustomAction 时文件确实在磁盘上不可用。但是,当我查看 InstallFiles 操作的定义时,文件应该已经存在。我敏锐地意识到 WiX/MSI 社区不喜欢 CustomActions,但是诸如只能从 %SystemDrive%\Windows(仍然存在)中读取 INI 文件以及需要 XML 文件操作等限制使得这些 CustomActions 成为必要。
  • 您可以在 WiX、Installshield、Advanced Installer 等中使用 XML 的内置功能...这是我想指出的。更好的测试。还是很难。磁盘上是否存在未写入的现有 INI 文件,或者该文件根本不存在?文件安装在哪里?你检查过位数问题吗? %ProgramFiles(x86)%%ProgramFiles% 基数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2021-12-31
  • 2019-09-09
  • 2021-10-18
  • 2019-04-26
  • 2017-11-12
  • 1970-01-01
相关资源
最近更新 更多