Пользовательские действия в C #, используемые через WIX сбой с ошибкой 1154
-
01-10-2019 - |
Вопрос
Я использую 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. Вы хотите позже в своем установке.
Для людей, которые приземляются на этой странице в будущем (ответ был изначально для плаката), есть целый список вещей, чтобы проверить:
- Вы ссылаетесь на правильную DLL в бинарной таблице?
- Вы ссылаетесь на правильное экспортированное имя функции?
- Ваш класс общественности?
- Ваш метод использует правильную подпись? Т.е. это:
- Отмечен правильным атрибутом настройки
- Помечен как публично?
- Помечен как статический?
- Вернуть AcceResult?
- Взять сеанс в качестве аргумента?
- Убедитесь, что вы используете 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. Это может дать вам довольно хорошее сообщение об ошибке.