2016-11-04 5 views
0

Я создал программу установки с установщиком WiX для моего приложения C#.Не удалось установить с помощью установщика WiX

Я использую Class CustomAction для установки базы данных SQL и установки прав на папку.

Существует мой класс:

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult AllowAppData(Session session){...} 

    [CustomAction] 
    public static ActionResult Install_SetupDataBase(Session session){...} 
} 

И product.wxs:

<Binary Id="CASetup.dll" SourceFile="$(var.SetupCustomAction.TargetDir)$(var.SetupCustomAction.TargetName).CA.dll" /> 
<CustomAction Id="CustomActionSetupAllow" BinaryKey="CASetup.dll" DllEntry="AllowAppData" Execute="immediate" /> 
<CustomAction Id="CustomActionSetupBase" BinaryKey="CASetup.dll" DllEntry="Install_SetupDataBase" Execute="immediate" /> 

<InstallExecuteSequence> 
    <Custom Action='CustomActionSetupAllow' After='InstallFinalize' /> 
    <Custom Action='CustomActionSetupBase' After='InstallFinalize' /> 
</InstallExecuteSequence> 

Сборки нормально, но когда установка выполнения У меня есть сообщение:

enter image description here

Я попробовал только CustomActionSetupAllow, и это работает fin е. Но с CustomActionSetupBase Я получил сообщение.

Как я могу узнать, что DLL отсутствует? И где я должен добавить ссылку?

ответ

2

Ошибка «не может быть запущена» не означает, что она отсутствует. Он находится в двоичной таблице файла MSI и будет выведен на диск для запуска. Ошибка означает, что она не загружается и не запускается или не сбой. Возможно, что отсутствуют зависимые Dll.

Одна из серьезных проблем заключается в том, что вы отметили, что пользовательское действие (CA) было незамедлительным. Это означает, что он запускается до того, как что-либо было установлено, например, возможно, пустую базу данных, которую вы могли бы заполнить, а также любые зависимые Dll, которые могут потребоваться. Кроме того, если вы создаете SQL-базу данных с немедленным ЦС, и впоследствии установка завершится неудачей, у вас будет БД, но нет установленного продукта. Это должно быть отложенное пользовательское действие, в идеале с CA отката для удаления БД, чтобы пользователь мог снова запустить установку, и вы снова не заполняете тот же БД, если это проблема.

Есть другие области, которые вы можете захотеть посмотреть. Непосредственный CA запускается с учетными данными пользователя установки и не повышается, поэтому, если код требует повышения, он будет терпеть неудачу. Отложенный CA будет работать с учетной записью системы, поэтому доступ к SQL-базе данных с системной учетной записью может быть проблемой. Код в ЦС должен быть очень защитным, поскольку это не та же среда, что и интерактивный тест. По этим причинам часто бывает лучше сделать это с помощью программы запуска, которая запускается в реальной интерактивной среде, когда приложение запускается в первую очередь.

+0

Я отметил пользовательское действие как 'After = 'InstallFinalize''. Оба пользовательских действия находятся в одном файле .cs. Когда я вызываю только «CustomActionSetupAllow», он работает хорошо, но только с «CustomActionSetupBase» появляется ошибка. Я вставил точки останова в первой строке и не сломался. Потенциалы, отсутствующие в DLL, находятся в проекте Setup или в проекте Custom Action? –

+0

Проклятый Я глуп ... Я не видел, что я удалил флаг '[CustomAction]' перед 'CustomActionSetupBase'. Я потратил столько времени на эту ошибку. Но хорошо знать, эта ошибка может произойти, если флаг отсутствует. Спасибо за помощь –

Смежные вопросы