WIX: CustomAction не может найти файл после «InstallFiles» - PullRequest
1 голос
/ 04 ноября 2019

В настоящее время я работаю над библиотекой CustomAction для чтения и записи файлов INI (за пределами C: \ Windows) и XML. Я уже посмотрел этот вопрос , но предложенные ответы не помогли с моей проблемой. 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"/>

Реализация (C #) моего CustomAction выглядит следующим образом:

    [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.

Для того, что я думаю, будет отложенная фаза (далее вlog):

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 на этапе отложенной фазы выполнения для доступа любых пользовательских действий. Кто-нибудь еще наблюдал подобное поведение и может подсказать, что еще делать?

1 Ответ

0 голосов
/ 05 ноября 2019

Сводка : вы можете читать значения из файла INI, используя настраиваемое действие в непосредственном режиме, и устанавливать свойства, которые используются установщиком Windows для записи значений в реальные файлы INI. встроенный способ во время обычной установки (никаких пользовательских действий, чтобы написать что-нибудь, только для чтения). Образец видео расширенного установщика (аналогичный подход).


Настраиваемые действия : Несколько замечаний о настраиваемых действиях:


INI : Краткое резюме (насколько мне известно):

  • INI Write: INI-файлы могут быть полностью записаны самой MSI в любом месте на диске
    • Вы можете использовать свойства для ввода пользовательских значений: [MYPROPERTY]
    • Таблица IniFile дубльЗабота обо всем этом, и она работает ОК
    • Не устанавливайте INI-файлы как отдельные файлы, используйте таблицу IniFile. Подробнее здесь
  • Чтение INI : поиск значения INI установщика Windows поддерживает только файлов вПапка %SystemDrive%\Windows (C:\Windows).
    • Другими словами: это просто чтение значений из любого места, что трудно (если это не изменилось без моего ведома - я вижу различные взломы здесь и там)
    • Вы можете читать значения из INIфайл, используя пользовательское действие немедленного режима и задайте свойства, которые используются установщиком Windows для записи значений в реальные файлы INI.
    • Здесь приведен пример кода для чтения файлов INI с помощью VBScript (только для того, чтобы помнить, что он есть, но не рекомендуется использовать его как таковой).
  • Образец установки видео Advanced Installer : Смотрите это видео о том, как действовать в отношении файлов INI в Advanced Installer (один из доступных основных инструментов MSI )

XML : запись и чтение XML вообще никогда не были частью MSI (в отличие от написания INI). Все основные инструменты поддерживают запись и чтение XML, и каждый инструмент делает что-то немного по-другому.

Это НЕЖелательно, чтобы вы добавили сюда свои функции, если вы можете справиться с тем, что уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...