WIX:“ InstallFiles”之后,CustomAction找不到文件

时间:2019-11-04 12:24:54

标签: wix windows-installer custom-action

我目前正在使用CustomAction库来读写INI(在C:\ Windows外部)和XML文件。我已经查看过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
...

当然,我现在在安装日志中查看了提示。日志显示: (我认为是立即阶段):

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.

我认为应该是 deferred 阶段(在日志中更进一步):

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都可以访问。 有没有其他人观察到类似的行为,可以给我提示其他方法吗?

1 个答案:

答案 0 :(得分:0)

  

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


自定义操作 :有关自定义操作的几件事:


INI :一个简短的摘要(据我所知):


XML :XML的读写完全不是MSI的一部分(与INI写作不同)。所有主要工具都支持XML读写,并且每个工具在外观上都有所不同。

  

如果可以的话,建议不要在此处滚动自己的功能   那里已经有东西了。