Исключение из System.IO.Directory.Delete не пойман в соответствии - PullRequest
1 голос
/ 28 марта 2019

Исключение из System.IO.Directory.Delete не попадает в привычное состояние (MSI генерируется с помощью wix toolset)

Имеется в .NET Framework 4.7.2 Windows 7 запущена с правами администратора

Лог-файл от звонка по обычаю:

MSI (A0: D8) [08: 31: 39: 027]: Выполнение операции: ActionStart (Name = CacheCustomActions.DeleteOldInstallationFolders ,,) MSI (s) (A0: D8) [08: 31: 39: 027]: выполнение op: CustomActionSchedule (Action = CacheCustomActions.DeleteOldInstallationFolders, ActionType = 1025, источник = BinaryData, Target = DeleteOldInstallationFolders, CustomActionData = XXXDIR =: \;) MSI (s) (A0: AC) [08: 31: 39: 028]: запуск удаленного настраиваемого действия. DLL: C: \ Windows \ Installer \ MSI7B8A.tmp, точка входа: DeleteOldInstallationFolders SFXCA: извлечение пользовательского действия во временный каталог: C: \ Windows \ Installer \ MSI7B8A.tmp- \ SFXCA: привязка к версии CLR v4.0.30319 Вызов пользовательского действия CustomActions! CustomActions.CustomActions.DeleteOldInstallationFolders ***** Начало удаленияOldInstallationFolders ***** Удаление папки: C: \ XXX \ temp ***** Удаление папки: C: \ XXX \ temp2 CustomAction CacheCustomActions.DeleteOldInstallationFolders вернул фактический код ошибки 1603 (обратите внимание, что это может быть не на 100% точно, если перевод произошел внутри песочницы)

                try
                {
                    session.LogWithTime($"Deleting directory {directory}");
                    Directory.Delete(directory, true);
                }
                catch (Exception e)
                {
                    session.LogWithTime($"Failed to delete directory {directory}");
                }

Ожидается: каталог удален или выброшено исключение Фактически: существует пользовательское действие с кодом ошибки 1603.

Файлы Wxs выглядят так, но я не думаю, что есть проблема, все работает отлично на сотнях компьютеров, только на одной машине произошла ошибка:

   <CustomAction Id="PrepareArgumentsForDeferredCall.DeleteOldInstallationFolders" Property="CacheCustomActions.DeleteOldInstallationFolders" Value="XXXDIR=[XXXDIR];ISEXPERTMODEENABLED=[ISEXPERTMODEENABLED]" Execute="immediate" />
[...]
   <CustomAction Id="CacheCustomActions.DeleteOldInstallationFolders" BinaryKey="CustomActionBinary" DllEntry="DeleteOldInstallationFolders" Execute="deferred" Return="check"/>
[...]
      <Custom Action="PrepareArgumentsForDeferredCall.DeleteOldInstallationFolders" After="CostFinalize" />
[..]
      <Custom Action="CacheCustomActions.DeleteOldInstallationFolders" After="InstallInitialize">NOT REMOVE AND NOT PATCH AND NOT REINSTALL</Custom>

1 Ответ

1 голос
/ 28 марта 2019

Отказ от ответственности : соблюдайте осторожность при удалении всех элементов (файлов / папок).Тест на виртуалы только.Очевидно.


MSI : Вы пытались использовать RemoveFile table в MSI?Это встроенная таблица MSI, позволяющая удалять файлы и папки в процессе установки.Только пустые папки. Образец .

WiX : есть также служебные функции dll в WiX's Util namespace: RemoveFolderEx Element (Util Extension) - это собственное пользовательское действие WiX, написанное на C ++, а не встроенное в MSI.Насколько я помню, вы можете удалять папки с файлами, используя этот подход.Прошло немало времени. Образец (непроверенный, используйте на свой страх и риск - очевидно).

  • Изменить источник WiX (элемент верхнего уровня): <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  • Добавить ссылку на WixUtilExtension.dll в основной папке установки WiX в разделе Program Files (x86).
  • Использовать элемент: <util:RemoveFolderEx On="install" Property="OldWebAPP" />

Проблемы с управляемым кодом : Используя вышеизложенное, вы полностью избегаете управляемого кода.Управляемый код страдает рядом уязвимостей, которые со временем проявляются - как вы уже видели.Блокировки безопасности для кода .NET, ошибочная загруженная версия .NET, проблемы с зависимостями GAC, вот старый и слишком болтливый ответ по теме (возможно, устаревшее содержимое, конечно, грязное и "чокнутое").

Проверка ошибок пользовательского действия : Обратите внимание, что вы также можете отключить проверку ошибок для пользовательского действия, к которому вы обращаетесь.Это должно позволить установщику продолжить работу без сбоев.Если это приемлемый вариант.Не очень, но возможно, я думаю.

Подавление настраиваемых действий : Наконец, если вы настраиваете настраиваемое действие значением свойства, вы можете запретить настраиваемое действиеработает, если вы передаете значение пользовательского свойства через командную строку:

Укажите в таблице свойств MSI: SUPPRESSERROR = 0.Затем - при необходимости - в командной строке установите:

msiexec.exe /x {PRODUCT-GUID} SUPPRESSERROR="1"

Внутри MSI вы настраиваете пользовательское действие удаления с помощью:

 REMOVE="ALL" AND SUPPRESSERROR="0"

Теперь настраиваемое действие не будет запускатьсяесли SUPPRESSERROR отличается от 0, что позволяет предотвратить запуск настраиваемого действия на компьютерах, на которых происходит сбой удаления, нажав custom uninstall command line (обратите внимание, что настраиваемое действие все еще можно настроить на проверку ошибок).

...