2009-07-31 4 views
11

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

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

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

Error 1723. There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor. Action ReadLicenseKeyFromFile, entry: ReadLicenseKey, library: 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. Я попытался установить файл как часть настройки, вручную скопировать вложенный файл, ничего не сделал для файла ... в основном пробовал все возможные комбинации.

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

ответ

11

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

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

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

+1

Когда я причинил себе ту же проблему, которую я использовал, зависит от того, как посмотреть на DLL и проверить правильные символы, которые действительно экспортируются. /L – leiflundgren

+0

Благодарим за сообщение вашего ответа, я просто сделал ту же самую (простую) ошибку, не осознавая ее, такое загадочное сообщение об ошибке! – si618

0

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

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

+0

Да, установка dll копируется при установке. нет, я не знаю, как имитировать использование dll. если вы имеете в виду, создавая новый проект, который ссылается на dll, а затем вызывает функцию, да, это происходит. –

+0

@ Антон Тихий - мне сообщили, что вы отправили ответ на мой вопрос час назад, но я не вижу этого ответа. Из моего профиля я мог видеть только часть ответа. В проекте пользовательских действий выполняется требуемая утилита из DTF, которая преобразует управляемую DLL в неуправляемую .CA.dll. и это .CA.dll - это то, что я устанавливаю вместе с моей настройкой. есть в любом случае, с помощью которого я могу проверить, какой путь находится в настройке, чтобы найти DLL? –

+0

Одной из проблем может быть переменный путь. Я никогда не использовал его так: - hardcode - реальный путь, чтобы увидеть, все ли работает. –