Собственное действие С# в Wix

Когда мое приложение удаляется, сервер должен быть уведомлен, чтобы он мог освободить лицензионный ключ, назначенный клиенту. Это делается через вызов веб-службы.

Я создал собственное действие С#, которое делает это. Проблема в том, что деинсталлятор уходит, говоря, что он не может найти dll.

Журнал ошибок для msi содержит следующую ошибку:

Ошибка 1723. Существует проблема с этот пакет установщика Windows. DLL требуется для завершения этой установки. не может быть запущен. Обратитесь в службу поддержки персонала или поставщика пакетов. действие ReadLicenseKeyFromFile, запись: ReadLicenseKey, библиотека: C:\Windows\Installer\MSI4F42.tmp

У меня есть функция ReadLicenseKey, помеченная как пользовательское действие. Пользовательское действие называется ReadLicenseKeyFromFile.

<Custom Action="ReadLicenseKeyFromFile" After="InstallInitialize">
    REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE
</Custom>

<CustomAction Id="ReadLicenseKeyFromFile" BinaryKey="UnInstallCA.CA.dll" DllEntry="ReadLicenseKey" Execute="immediate" Return="check" />

<Binary Id="UnInstallCA.CA.dll" SourceFile="$(var.UnInstallCA.TargetDir)UnInstallCA.CA.dll" />

Проект пользовательского действия выводит файл .CA.dll. Я попытался установить файл как часть настройки, вручную скопировать вставленный файл, ничего не сделал для файла... в основном пробовал все возможные комбинации.

Должно быть что-то, что мне не хватает, поэтому, пожалуйста, помогите.

Ответ 1

Мне жаль, что все время тратили впустую.

Решение было чем-то слишком простым. Я забыл поместить атрибут [CustomAction] для этого конкретного метода. Поэтому, хотя это было последнее действие, которое я написал в моем файле CustomAction.cs, он был первым, который вызывается в InstallExecuteSequence. И из-за этого, я попал в заблуждение, думая, что он не сможет найти файл. Ну, это, а также тот факт, что я, должно быть, был действительно сонным...

Во всяком случае, при поиске ответа мне удалось найти множество приятных ресурсов, особенно серию Alex Shevchuks на Wix. Еще одна вещь, которую я понял, это то, что мне не нужно устанавливать файл DLL пользовательского действия. Я просто ссылаюсь на него из моего проекта Wix и предоставляю ему путь. DLL внедряется в настройку и отправляется оттуда, когда нужно вызывать удаленные пользовательские действия.

Ответ 2

Скопирован ли ваш UnInstallCA.CA.dll на целевой компьютер во время установки? Кажется, что он не там при удалении.

Если он туда попадет - может ли он работать? (попробуйте запустить его с целевой машины, чтобы узнать, может ли он делать то, что он должен был делать - может быть, вам нужно отправить какую-нибудь другую dll, которую вы используете из этого, или, может быть, какой-то распространяемый пакет)