Пользовательское действие в С#, используемое через WiX, с ошибкой 1154
Я использую WiX 3.5.1930 в Visual Studio 2010, ориентируясь на .NET Framework 3.5. (Позже еженедельные сборки WiX кажутся очень сломанными по отношению к их шаблону пользовательских действий, по крайней мере на данный момент. 1930 - это самая последняя сборка, которая, похоже, создает встроенный С# CA с рабочими ссылками.)
У меня есть две сборки пользовательских действий, написанные на С#. Один из них отлично работает. Другая ошибка со следующей ошибкой:
CustomActionnNameHere returned actual error code 1154 (note this may not be 100% accurate if translation happened inside sandbox)
Я сравнил файлы .csproj и .wixproj, и насколько я могу сказать, что различия являются подходящими (например, список включенных файлов .cs). Я изменил неработающие .wxs для вызова рабочего пользовательского действия вместо неработающего пользовательского действия, и он работает как epxected.
Что еще я могу посмотреть, чтобы заставить это работать?
Изменить: просто для того, чтобы быть полным 1154 относится к недопустимой DLL - net helpms переводит его (на английском языке) на "Один из файлов библиотеки, необходимых для запуска этого приложения, поврежден".
Второе редактирование: выполнялось перевернутое против dll (захватили копию из \windows\installer во время работы установщика), и он говорит, что все в порядке в 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" />
Ответы
Ответ 1
Похоже, вы используете DTF. Если вы видите:
using Microsoft.Deployment.WindowsInstaller;
то вы, безусловно, знаете. Обязательно прочтите следующие сведения о том, как все это работает:
Управляемые пользовательские действия с инструментами развертывания (DTF)
Также вы найдете справочную команду DTF в стартовом меню в разделе WiX.
В основном мне кажется, что вы подключаете сборку .NET в установщик вместо dll без изменений. Прочитайте вышеприведенную статью для обзора того, как ее посмотреть в зависимости от того, как ее искать и знать, чего ожидать. WiX | Проект С# Custom Action должен выводить Foo.dll и Foo.CA.dll. Вы хотите позже в своем установщике.
Для людей, которые приземляются на этой странице в будущем (ответ был первоначально для плаката), есть целый список вещей, которые нужно проверить:
- Вы ссылаетесь на правильную DLL в двоичной таблице?
- Вы ссылаетесь на правильное имя экспортируемой функции?
- Является ли ваш класс общедоступным?
- Используется ли ваш метод с использованием правильной подписи? То есть это:
- Отмечено с правильным атрибутом CustomAction
- Отмечено как общедоступное?
- Отмечено как статический?
- Возврат ActionResult?
- Возьмите сеанс как аргумент?
- Убедитесь, что вы используете тип проекта WiX С# Custom Action, чтобы гарантировать, что событие postbuild вызывается для создания собственной DLL-оболочки. (См. № 1).
Любой из них может вызвать ошибку 1154. Именно по этой причине я написал всеобъемлющую статью в блоге по этому вопросу и связан с ней в этом ответе. Важно полностью понять, как управляемый код представлен неуправляемой службе установщика Windows и знать, как использовать Depends для проверки того, что публичный статический метод экспортируется как функция stdcall в полученной в результате .CA.dll, которую производит WiX/DTF.
Ответ 2
Я только что нашел ту же проблему (, используя правильный файл .CA.dll), и в моем случае это было потому, что я не использовал статический метод. У меня было это:
public ActionResult MyMethod(Session session)
Вместо этого:
public static ActionResult MyMethod(Session session)
После изменения метода он работал нормально.
Надеюсь, что это поможет кому-то.
Ответ 3
Если вы создаете свое собственное действие в Visual Studio (Votive), убедитесь, что вы создали проект Wix Custon Action, а не библиотеку классов, иначе вам придется использовать инструмент MakeSfxCA для упаковки вашего пользовательского действия.
Ответ 4
Я натолкнулся на еще одну очень простую (и глупую) причину ошибки 1154: ошибка написания имени записи DLL в элементе CustomAction...
Сравнивая различные причины, которые обнаружили другие люди, мне кажется, что ошибка 1154 в большинстве случаев означает "запись в DLL не найдена".
Ответ 5
Другая причина, по которой я видел эту ошибку, заключалась в том, что я забыл добавить атрибут [CustomAction] к имени моей функции С#.
Ответ 6
Попробуйте ввести свой вызов в
<InstallExecuteSequence/>
в надежде получить лучшее сообщение об ошибке. Я получил разные сообщения об ошибках в зависимости от того, как было вызвано действие. Кроме того, попробуйте использовать fuslogvw.exe. Это может дать вам довольно приятное сообщение об ошибке.
Ответ 7
В моем случае это была длина имени функции. Это было 27 символов, и мы получили ошибку.
Мы изменили имя функции на 24 символа, и она сработала.