Во-первых, да, я знаю, что проекты установки VS - зло. Это то, с чем мне нужно работать. Я также видел несколько связанных вопросов, но они либо остаются без ответа, либо не соответствуют моей ситуации достаточно близко, чтобы ответ работал (или они твердят о пороках проектов установки VS и чудесах WiX).
У меня есть проект установки для моего приложения. Копирование файлов работало нормально, но мне нужно было выполнить два дополнительных действия после копирования файлов. Я создал класс установщика и настроил его как настраиваемое действие в проекте установки, и его скелет (который не работал, просто показал диалоговое окно, чтобы я мог подключить отладчик и осмотреться) работал нормально. Затем я обнаружил, что мне нужно передать параметры из MSI в мое настраиваемое действие, чтобы я мог получить к ним доступ через свойство Context класса установщика.
Вот текущий код класса установщика (некоторые имена были изменены для защиты невиновен). По сути, он ничего не делает, кроме показа диалогового окна в нужное время (после копирования файлов, но до завершения установки):
namespace MyApp.Install.CustomSetup
{
[RunInstaller(true)]
public partial class MyAppCustomInstallActions : System.Configuration.Install.Installer
{
public MyAppCustomInstallActions()
{
InitializeComponent();
}
protected override void OnAfterInstall(IDictionary savedState)
{
try
{
base.OnAfterInstall(savedState);
if (MessageBox.Show(
"Custom Action OnAfterInstall successfully integrated. You can attach a debugger if desired. Do you wish to perform the custom actions?",
"DEBUG", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
SetEditablePermissionOnFolder(savedState);
SetApplicationSettingsFromWizard(savedState);
}
catch (Exception ex)
{
Context.LogMessage(ex.ToString());
throw;
}
}
private void SetApplicationSettingsFromWizard(IDictionary savedState)
{
//TODO: Implement
}
private void SetEditablePermissionOnViewerFolder(IDictionary savedState)
{
//TODO: Implement
}
}
}
План состоит в том, чтобы заставить работать настраиваемые действия, затем вынуть диалоговое окно и просто сделать это.
Вот строка для CustomActionData для действия Install настраиваемых действий проекта установки:
/phonenumber=[phonenumber] /thirdpartyinstallpath1="[thirdpartyinstallpath1]\" /thirdpartyinstallpath2="[thirdpartyinstallpath2]\" /thirdpartyinstallpath3="[thirdpartyinstallpath3]\"
Если я не использую эту строку параметра, она ' в порядке, но у меня нет параметров. Если я укажу эту строку, установщик завершится неудачно до того, как появится мое собственное диалоговое окно, с двумя ошибками: «Исключение при инициализации установки: не удалось загрузить файл или сборку» file: /// C: \ Windows \ SysWOW64 \ Files 'или одна из его зависимостей. Система не может найти указанный файл «
и » Ошибка 1001. Не удалось найти файл C: \ Program Files (x86) \ MyCompany \ MyApp \ MyApp.Install .CustomSetup.InstallState "
.
Что я делаю не так? Я что-то не так делаю? Есть ли решение, которое не требует от меня воссоздания установщика с использованием какой-либо другой структуры?
РЕДАКТИРОВАТЬ: Я обнаружил, что удаление всего, кроме параметра номера телефона, и помещение [PHONENUMBER] в кавычки позволяет это передаваемый параметр. Однако, Я не могу передать ни один из путей к каталогам; Я пробовал использовать [INSTALLDIR] именно так, как говорится в нескольких блогах и пошаговых руководствах, без костей.