it-swarm-ru.tech

MSI Installer не может найти 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]\"

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

15
KeithS

Я обнаружил, что проблема была в формате строки параметра. Поскольку различные параметры, хотя они и были путями к файлам, включали имя файла вместо того, чтобы заканчиваться обратной косой чертой, мне не требовалась конечная обратная косая черта для завершения этих строк значений. Поскольку я все равно это сделал, заключительные кавычки были обработаны как часть строки, что заставило парсер использовать следующую открывающую кавычку в качестве конца предыдущего значения, что повредило всю строку параметров. Из-за этого InstallState не мог быть написан правильно, и потерпел неудачу, когда пользовательская логика установки пыталась использовать его.

6
KeithS

У меня была похожая проблема, и я решил ее:

В свойствах вашего настраиваемого действия установите для InstallerClass значение false.

9
bplus

Если кто-то получит эту ошибку после обновления с VS2008 до VS2010 , то просмотрите эту ветку: http://social.msdn.Microsoft.com/Форум/EN-US/winformssetup/резьба/829d5c90-9a0d-4258-9d4d-1341cc50f95b /

Это решило проблему для меня:

Измените "BackwardCompatibleIDGeneration" на true при настройке свойств проекта.

2
surfen

В одном я бы удостоверился, что мои пути были должным образом спасены; либо сделай это с

@"My Documents\Blah"

или же

"My\ Documents\\Blah"
1
Coder2000

В моем случае это было потому, что я по ошибке добавил пользовательское действие в узел отката вместо узла установки. Простая ошибка.

0
user2271801

Проблема в том, что один обратный слеш перед завершающей кавычкой будет интерпретироваться как кавычка, которая принадлежит строке и не завершает строку. В строке CustomactionActionData

/thirdpartyinstallpath1="[thirdpartyinstallpath1]\" /thirdpartyinstallpath2="[thirdpartyinstallpath2]\"

установщик подставляет [thirdpartyinstallpath1] и [thirdpartyinstallpath2] с помощью ввода пользователя и затем пытается интерпретировать строку CustomactionActionData. Если пользовательский ввод для "thirdpartyinstallpath1" - "C:\Test \", то приведенная выше строка CustomactionActionData может быть в порядке, но если пользователь вводит "C:\Test", установка завершается с ошибкой

"Возникла исключительная ситуация при инициализации установки: не удалось загрузить файл или сборку 'file: /// C:\Windows\SysWOW64\Files ...' или одну из его зависимостей ..."

Со строкой CustomactionActionData, например

/thirdpartyinstallpath1="[thirdpartyinstallpath1]" /thirdpartyinstallpath2="[thirdpartyinstallpath2]"

установка завершится неудачно, если пользователь введет "C:\Test \". Это будет нормально, если пользовательский ввод "C:\Test". Но вы никогда не можете знать, что будет делать пользователь.

Мой обходной путь - пустой перед самой завершающей строкой:

/thirdpartyinstallpath1="[thirdpartyinstallpath1] " /thirdpartyinstallpath2="[thirdpartyinstallpath2] "

поэтому нет никаких изменений, чтобы убрать завершающую строку с помощью пользовательского ввода. В коде вы можете удалить все начальные и конечные пробельные символы из пользовательского ввода Trim

0
Rudolf Brinkmoeller