Во-первых, да, я знаю, что Проекты Установки 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]\"
Если я не использую эту строку параметров, это нормально, но у меня нет параметров. Если я укажу эту строку, установщик завершит работу до того, как появится мое диалоговое окно, с двумя ошибками: "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"
.
Что я делаю не так? Я делаю что-то не так? Есть ли решение, которое не требует от меня повторного создания установщика с использованием какой-либо другой инфраструктуры?
РЕДАКТИРОВАТЬ: Я обнаружил, что удаление всего, кроме параметра номера телефона, и помещая [PHONENUMBER] в кавычки, позволяет передать этот параметр. Однако я не могу передать ни один из путей к каталогам; Я попробовал с [INSTALLDIR] в точности то, что несколько блогов и пошаговых руководств говорят, что делать это, без косточек.