MSI Installer не может найти InstallState при использовании пользовательских действий с параметрами - PullRequest
15 голосов
/ 15 февраля 2011

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

Ответы [ 6 ]

9 голосов
/ 14 октября 2011

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

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

6 голосов
/ 17 февраля 2011

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

2 голосов
/ 25 июня 2012

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

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

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

1 голос
/ 15 февраля 2011

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

@"My Documents\Blah"

или

"My\ Documents\\Blah"
0 голосов
/ 06 сентября 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...