Установщик MSI не может найти InstallState при использовании настраиваемого действия с параметрами

Во-первых, да, я знаю, что проекты установки 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] именно так, как говорится в нескольких блогах и пошаговых руководствах, без костей.

15
задан KeithS 15 February 2011 в 20:02
поделиться