Пользовательские действия в C #, используемые через WIX сбой с ошибкой 1154

StackOverflow https://stackoverflow.com/questions/3560370

Вопрос

Я использую WIX 3.5.1930 в Visual Studio 2010, нацелен на .NET Framework 3.5. (Позже еженедельные сборки Wix, похоже, очень разбиты в отношении их пользовательских шаблонов действий, по крайней мере, на данный момент. 1930 - самая последняя сборка, которая, кажется, делает построенный C # CA с рабочими ссылками.)

У меня есть две пользовательские агрегаты действий, написанные в C #. Один из них работает нормально. Другой не удается со следующей ошибкой:

CustomActionnNameHere returned actual error code 1154 (note this may not be 100% accurate if translation happened inside sandbox)

Я сравнил файлы .csproj и файлы .wixproj, и, как лучше, я могу сказать, что различия подходят (например, список включенных файлов .cs). Я изменил нерабочее значение .wx, чтобы вызвать рабочие пользовательские действия вместо неработающих пользовательских действий, и он работает как повторно.

Что еще я могу посмотреть, чтобы получить эту работу?

Редактировать: Просто чтобы быть завершенным 1154, относится к неверной DLL - Net HelpMSG Переводит его (на английском языке) на «Одним из файлов библиотек, необходимых для запуска этого приложения».

Второе редактирование: RAN PEEVINE против DLL (схватил копию Windows Установщика, пока запущен установщик), и он говорит, что все в порядке в DLL. DLL имеет только настольный метод действий с «возвратом успеха», поэтому для него нечего убедиться, но он подтверждает, что DLL не поврежден.

Третье редактирование: код в сломанном пользовательском действии следует:

using Microsoft.Deployment.WindowsInstaller;

namespace Framework.Installer.Database {
    public class CustomActions {

        [CustomAction]
        public static ActionResult RunMigration(Session session) {

            return ActionResult.Success;
        }

    }
}

Не много для этого. Соответствующие части .wxs следующие:

<InstallExecuteSequence>
  <Custom Action="DotNetMigratorCustomActionPreviousUp" After="SetMigrationPropertiesPreviousUp"><![CDATA[(&Database = 3)]]></Custom>
</InstallExecuteSequence>

<Binary Id="DotNetMigratorCustomActionDll"
        SourceFile="$(var.Framework.Installer.Database.CustomActions.TargetDir)\SoftwareAnswers.Framework.Installer.Database.CustomActions.dll" />

<CustomAction Id="DotNetMigratorCustomActionPreviousUp"
              Return="check"
              BinaryKey="DotNetMigratorCustomActionDll"
              DllEntry="RunMigration"
              Execute="deferred" />
Это было полезно?

Решение

Похоже, вы используете DTF. Если ты видишь:

using Microsoft.Deployment.WindowsInstaller;

Тогда вы конечно. Обязательно прочитайте следующее за то, как все это работает:

Фонд инструментов развертывания (DTF) Управляемые пользовательские действия

Также вы обнаружите, что DTF поможет CHM в меню «Пуск» под WIX.

В основном это звучит мне, вы подключаетесь к монтажу .NET в установщик вместо DLL Tranced Wrapper. Прочитайте вышеуказанную статью для обзора того, как посмотреть на него зависит и узнать, что ожидать. Wix |. C # Custom Action Project должен выводить foo.dll и foo.ca.dll. Вы хотите позже в своем установке.

Для людей, которые приземляются на этой странице в будущем (ответ был изначально для плаката), есть целый список вещей, чтобы проверить:

  1. Вы ссылаетесь на правильную DLL в бинарной таблице?
  2. Вы ссылаетесь на правильное экспортированное имя функции?
  3. Ваш класс общественности?
  4. Ваш метод использует правильную подпись? Т.е. это:
  5. Отмечен правильным атрибутом настройки
  6. Помечен как публично?
  7. Помечен как статический?
  8. Вернуть AcceResult?
  9. Взять сеанс в качестве аргумента?
  10. Убедитесь, что вы используете The WiX C # Type Custom Action Project Project, чтобы убедиться, что событие PostBuild вызывается для создания нативной обертки DLL. (См. # 1)

Любой из них может вызвать ошибку 1154. Это причина, по которой я написал всеобъемлющий блог по предмету и связанным с ним в этом ответе. Важно полностью понять, насколько управляемый код представлен в неуправляемом службе установщика Windows и узнать, как использовать, зависит от проверки того, что общедоступный статический метод экспортируется как функция STDCALL в результате .Ca.dll, что WIX / DTF производит.

Другие советы

Если вы создаете свои пользовательские действия в Visual Studio (Viefive), убедитесь, что вы создали проект Action Action Wix Coveron, а не в библиотеке классов, в противном случае вы должны использовать инструмент MakefxCA, чтобы упаковать свои пользовательские действия.

Я только что нашел ту же проблему (используя правильный файл .ca.dll) И в моем случае это было потому, что я не использовал статический метод. У меня было это:

public ActionResult MyMethod(Session session)

Вместо этого:

public static ActionResult MyMethod(Session session)

После изменения метода он работал просто хорошо.

Надеюсь, это поможет кому-то.

Я ударил еще одну очень простому (и глупому) причину ошибки 1154: Messpelling Имя входа DLL в элементе настройки ...

Сравнение различных причин, что другие люди нашли, что мне кажется, что ошибка 1154 означает в большинстве случаев, «DLL-запись не найдена».

Другая причина, по которой я увидела эту ошибку, было потому, что я забыл добавить атрибут [Thumbaction] на имя моей функции C #.

В моем случае это была длина имени функции. Это было 27 символов, и мы получали ошибку. Мы изменили имя функции на 24 символа, и оно сработало.

Попробуйте положить свой пользовательский вызов действий в

<InstallExecuteSequence/>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top