Wix CustomAction не может получить доступ к записанным файлам до InstallFinalize - PullRequest
0 голосов
/ 26 марта 2020

У меня есть проект Wix, который должен установить мое приложение c#. Исключения File Copy и Firewall уже работают. Теперь я хочу изменить файлы конфигурации json с помощью специального действия. Я хочу прочитать все json файлы, изменить некоторые значения и записать их обратно в программные файлы. Вот мое определение CA:

<CustomAction Id="PrepareConfigurationFilesCustomAction" BinaryKey="InstallerCA" DllEntry="PrepareConfigurationFilesCustomAction" Execute="immediate" Impersonate="no" Return="check" />
<CustomAction Id="CreateConfigurationFiles" BinaryKey="InstallerCA" DllEntry="CreateConfigurationFiles" Execute="deferred" Impersonate="no" Return="check" />
<Custom Action="PrepareConfigurationFilesCustomAction" Before="CreateConfigurationFiles">NOT Installed AND NOT REMOVE</Custom>
<Custom Action="CreateConfigurationFiles" Before="InstallFinalize">NOT Installed AND NOT REMOVE</Custom>

Если я открою .msi wirth Orca, порядок действия ios кажется правильным.

введите описание изображения здесь

InstallFiles                                                            4000
PrepareConfigurationFilesCustomAction   NOT Installed AND NOT REMOVE    6598
CreateConfigurationFiles                NOT Installed AND NOT REMOVE    6599

Но когда я запускаю .msi, я получаю исключение

Excetion TrownSystem.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Program Files\Vendor\Product\etc\Configurations'.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileSystemEnumerableIterator`1.CommonInit()
   at System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)
   at System.IO.Directory.GetFiles(String path)
   at Vendor.Application.Product.Setup.Actions.CustomActionData.ConfigurationFilesCustomActionData.CreateSessionCustomActionData(Session session) in C:\work\\Projects\Installation\Packages\Product.Workstation\Setup.Actions\CustomActionData\ConfigurationFilesCustomActionData.cs:line 99

Когда я присоединяю отладчик, я вижу в коде и в файловой системе, что файлы отсутствуют.

Если я изменю первый Ca (PrepareConfigurationFilesCustomAction) на Execute = "deferred", файлы будут записаны, но я не могу получить доступ к значениям сеанса ...

Any Идеи или решения для меня?

Спасибо!

1 Ответ

0 голосов
/ 26 марта 2020

Решение? : Лучшее решение - установить файлы JSON в папку только для чтения, а затем использовать приложение, чтобы скопировать их в профиль пользователя и обновить их. в соответствии с тем, что вам нужно. Это не всегда возможно - например, когда нет двоичного файла приложения для запуска.

Доступ запрещен : вы не можете записывать в местоположения в программных файлах как обычные пользователь. Вот фрагмент по этому вопросу: System.UnauthorizedAccessException при запуске .exe под программными файлами

Технические : причина поведения, которое вы видим, что InstallExecuteSequence обрабатывается дважды. Сначала в «немедленном режиме», который запускает настраиваемые действия немедленного режима и создает сценарий транзакции для выполнения. Когда вы достигаете InstallFinalize, последовательность запускается снова из InstallInitialize, и в этот момент система обновляется установкой файла, изменениями реестра и т. Д. c ... Пользовательские действия в этом режиме откладываются. Они не могут напрямую получить доступ к свойствам. Значения свойств должны быть «отправлены» им через механизм, называемый CustomActionData. Довольно неуклюжий. Не требуется, если вы используете приложение для выполнения работы?

Концепция CustomActionData была так хорошо объяснена ранее другими, что я просто ссылаюсь на информацию, к которой вы можете получить доступ в другом месте:

...