Прежде всего, да, я знаю, что проекты VS Setup являются злыми. Это то, с чем мне нужно работать. Я также видел несколько связанных вопросов, но они либо остаются без ответа, либо не соответствуют моей ситуации достаточно близко для ответа на работу (или они рассказывают о зле VS Setup Projects и чудеса 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 для действия установки пользовательских действий проекта установки:
/phonenumber=[phonenumber] /thirdpartyinstallpath1="[thirdpartyinstallpath1]\" /thirdpartyinstallpath2="[thirdpartyinstallpath2]\" /thirdpartyinstallpath3="[thirdpartyinstallpath3]\"
Если я не использую эту строку параметров, это нормально, но у меня нет параметров. Если я укажу эту строку, программа установки завершит работу до появления моего собственного диалогового окна с двумя ошибками: "Exception occurred while initializing the installation: Could not load file or assembly 'file:///C:\Windows\SysWOW64\Files' or one of its dependencies. The system cannot find the file specified"
и "Error 1001. Could not find file C:\Program Files (x86)\MyCompany\MyApp\MyApp.Install.CustomSetup.InstallState"
.
Что я делаю неправильно? Я что-то делаю неправильно? Есть ли решение, которое не требует от меня повторного создания установщика с использованием какой-то другой структуры?
EDIT: Я обнаружил, что удаление всего, кроме параметра номера телефона, и установка [PHONENUMBER] в кавычках позволяет передать этот параметр. Однако я не могу пройти ни один из путей к каталогам; Я попытался с помощью [INSTALLDIR] точно, как несколько блогов и пошаговых инструкций говорят, чтобы сделать это, без кубиков.