Проблема с удалением Wix с помощью CustomAction - PullRequest
2 голосов
/ 17 марта 2019

Я создал очень простой MSI, который копирует некоторые файлы в каталог ProgramFiles и при установке вызывает пользовательские действия, найденные в двоичном файле, написанном на C #.

Во время установки я могу легко вызвать любое пользовательское действиеЯ хочу.Например, я создал шаг установки, на котором пользователь должен ввести лицензию, и после подтверждения лицензии она проверяется на сервере с помощью логики, написанной в настраиваемом действии C #.

Но при удалении каждый раз, когда ядобавив пользовательское действие (даже если оно ничего не делает, кроме возврата Success), я получаю ошибку, что установка не удалась.

Вот как я использую шаг удаления:

<InstallExecuteSequence>
  <Custom Action='TestUninstallation' After='MsiUnpublishAssemblies'>REMOVE="ALL"</Custom>
</InstallExecuteSequence>

где TestUninstallation isопределяется следующим образом:

<CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no" BinaryKey="TestCustomAction" DllEntry="Uninstall" />

Свойство DllEntry равно Uninstall, что является методом C #, который возвращает только Success.

После завершения установки я пытаюсь удалить и получаюдиалог UserExit, определенный внутри AdminUISequence со свойством OnExit.

Есть идеи, что мне не хватает?

1 Ответ

0 голосов
/ 17 марта 2019

Отладка : управляемый код относительно прост в отладке (собственный код на самом деле еще проще).Вот несколько указателей:


Предложения : я думаю, у вас просто есть broken reference to the dll export function - другими словами, ошибочное имя / ссылка на функцию dll:

<CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no"
              BinaryKey="CustomActions" DllEntry="__ERRONEOUS FUNCTION REFERENCE__" />

Просто проверьте, что dll на самом деле экспортирует, и сопоставьте так:

<CustomAction Id="CustomAction1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>

Как всегда реальноеMcCoy - это проверка самой библиотеки DLL на наличие правильного имени функции ( снимок экрана ниже из этого предыдущего ответа, рекомендуется прочитать ).

This is a native code C++ dll:

Dependency Walker

This is a DTF-packaged managed code dll:

Managed Code Custom Action

Обратите внимание, что это нативный dll со встроенным компонентом управляемого кода.Он дает совершенно другой список функций, но вам все равно нужно найти там имя функции, к которому вы обращаетесь.

This is a straight-up managed code dll (no native wrapping):

Managed code dll, unwrapped

И, наконец, это DLL-библиотека управляемого кода с прямым набором кода без оболочки в собственной оболочке DLL.


Un-UninstallableНастройка : если во время удаления происходит сбой или сбой настраиваемого действия, у вас будут проблемы с удалением установки (она просто откатывается, и вы застряли с установленным).Существует несколько исправлений или обходных путей.

Общее исправление, на мой взгляд, состоит в том, чтобы не вызывать сбой пользовательских действий при удалении или, по крайней мере, обусловить их, чтобы можно было принудительно удалить удаление, задав свойство черезкомандная строка :

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

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

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

REMOVE="ALL" AND SUPPRESSERROR="0"

Теперь пользовательское действие не будет запускаться, если SUPPRESSERROR установленкроме 0.

Существует более старый ответ с несколькими дополнительными опциями: Я облажался, как я могу удалить свою программу? (любезно Вим Коенен , ся перепутал его ответ с дополнительными предложениями).


Boilerplate : Для быстрого использования, позвольте мне просто выбросить шаблонный тестовый проект специального действия для специальных действийВот.Предполагается, что проект настраиваемого действия управляемого кода на C # "CustomAction1" в том же решении Visual Studio и ссылка на него добавляются в исходный код WiX - как вы, очевидно, уже сделали (это будет позже, когда у нас будут всезабыл в чем проблема и нужно еще раз протестировать):

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="WiXCustomActionsTesting" Language="1033" Version="1.0.0.0"
           Manufacturer="test" UpgradeCode="PUT-GUID-HERE">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <UIRef Id="WixUI_Mondo" />
    <Property Id="SUPPRESSERROR" Value="0" Secure="yes" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes" />

    <Feature Id="ProductFeature" Title="WiXCustomActionsTesting" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>

    <!--BEGIN CUSTOM ACTION SECTION-->

      <Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />
      <CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no" BinaryKey="CustomActions" DllEntry="CustomAction1" />

      <InstallUISequence></InstallUISequence>

      <InstallExecuteSequence>
        <Custom Action='TestUninstallation' After='InstallInitialize'></Custom>
      </InstallExecuteSequence>

    <!--END CUSTOM ACTION SECTION-->

  </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="WiXCustomActionsTesting" />
            </Directory>
        </Directory>
    </Fragment>

  <Fragment>

    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">

      <Component>
        <File Source="C:\Projects\MySetup\MyApp.exe">
        </File>
      </Component>

    </ComponentGroup>

  </Fragment>
</Wix>
  1. Создать проект WiX
  2. Скопировать, вставить код, установить новый GUID обновления
  3. СоздатьПроект CustomAction, имя по умолчанию
  4. Добавление ссылки на проект настраиваемого действия из проекта wix
  5. Добавление ссылки на WiXUIExtension.dll
  6. Настройка пути к файлу в компоненте
  7. Компиляция
...