Установщик Visual Studio ›Как запустить приложение после завершения установки

Вероятно, это глупый вопрос, и мой поиск в Google просто не работает сегодня.

У меня есть приложение, в которое я добавил проект Visual Studio Installer> Setup Wizard. Мне интересно, как добавить кнопку или флажок, который запускал бы приложение после успешной установки. Он будет расположен на последней странице установочного пакета MSI. Я использую Visual Studio 2010 Ultimate.

Мне это нужно, чтобы, когда приложение выполняет автоматическое обновление, оно автоматически запускает установщик. Мне просто нужен установщик, чтобы перезапустить приложение после обновления.

Это, наверное, очень просто, но хоть убей, я не могу этого понять. Заранее спасибо за вашу помощь.


person ThaKidd KG5ORD    schedule 02.07.2010    source источник
comment
Я бы рекомендовал использовать решение Cheeso здесь.   -  person Baddack    schedule 05.12.2015


Ответы (7)


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

Чтобы запустить любое приложение после завершения установки,

  1. Щелкните правой кнопкой мыши свой проект установки, выберите «Настраиваемые действия».
  2. Затем щелкните правой кнопкой мыши «Зафиксировать», «Добавить настраиваемое действие» и выберите файл, который хотите запустить. (Обратите внимание, что он уже должен быть в папке вашего приложения, что не должно быть проблемой в вашем случае, поскольку вы все равно запускаете свою программу.
  3. Просто выберите результат вашего проекта.
  4. Затем щелкните этот добавленный .exe и измените InstallerClass на false. Это очень важно, потому что в противном случае он будет искать программу установки.
  5. Вы даже можете передать параметры в свой .exe, добавив их в свойство Arguments.
person sbenderli    schedule 02.07.2010
comment
Отлично ... один вопрос, будет ли основное приложение рассматриваться как «Основной вывод ApplicationName (Active)»? - person ThaKidd KG5ORD; 03.07.2010
comment
Одна проблема. Приложение установки запускает мое приложение, но никогда не закрывается, пока я не выйду из приложения. Он застревает на 98% и заканчивается только тогда, когда я выхожу из приложения. Есть ли способ корректно завершить работу установщика? Я убедился, что установил для InstallerClass значение False. Что-то мне не хватает? - person ThaKidd KG5ORD; 03.07.2010
comment
ааа да, это произойдет ... в моем случае это было приемлемо. вместо этого вы можете запустить сценарий из установщика, который, в свою очередь, запустит ваше приложение и выйдет. Таким образом, ваше приложение будет запущено, но сценарий завершится, что позволит вашему установщику также завершить работу. - person sbenderli; 03.07.2010
comment
Я просто ввел УСТАНОВЩИК в качестве аргументов, а в точке входа моего приложения сделал: if (args.Length == 1 && args [0] == INSTALLER) {Process.Start (Application.ExecutablePath); возвращение; } Примечание: не используйте Application.Restart (), поскольку он передает тот же аргумент ;-) - person Danny Tuppeny; 18.08.2011
comment
Или, чтобы использовать решение Дэнни в приложении WPF: сначала создайте метод точки входа: frankmao.com/2009/05/07/ Затем добавьте это в метод: if (e.Args.Length == 1 && e.Args [0] == УСТАНОВЩИК ) {Process.Start (Assembly.GetExecutingAssembly (). Местоположение); Application.Current.Shutdown (); } - person Anders; 02.11.2011
comment
Просто к сведению, exe в конечном итоге будет работать как учетная запись с высокими привилегиями, а не как обычная учетная запись, может или не может быть проблемой для вас (это для меня) stackoverflow.com / questions / 3939731 / - person Maurice Flanagan; 31.12.2011
comment
Когда срабатывает коммит? Это после завершения установки? - person Urbycoz; 01.02.2012
comment
Мне очень жаль, но это неверный ответ. Во-первых, пользовательские действия фиксации предназначены только для очистки данных отката. Они не выполняются, когда откат отключен. Затем обсуждаются проблемы модели безопасности. - person Christopher Painter; 10.10.2013
comment
Установщик, созданный VS2010, не может запускать сценарии JS, если вы устанавливаете в Windows 8. Требуемый сценарий и т. Д. Не может быть запущен. Это единственный случай, который я тестировал; насколько я знаю, он никогда не работал ни при каких обстоятельствах. - person 15ee8f99-57ff-4f92-890c-b56153; 02.03.2015
comment
Я хочу поцеловать тебя за это, это спасло мне день, спасибо большое - person Arsalan Saleem; 31.08.2015
comment
Как отметил Морис Фланаган, exe будет работать как учетная запись с высокими привилегиями. Это привело к тому, что мое приложение не работало правильно, если оно не было запущено от имени администратора. Даже удаление решения sbenderli не устранило мою проблему. Чтобы решить мою проблему, мне пришлось удалить решение sbenderli из моего проекта, а затем изменить код продукта и код обновления. Надеюсь, это кому-то сэкономит время. - person Baddack; 04.12.2015
comment
В моем сценарии я хотел запустить исполняемый файл, который установил журнал в средство просмотра событий Windows, прежде чем пользователь получит возможность использовать приложение. Я создал основной вывод из WindowsEventLogMaker в папке «Настраиваемые действия» ›Установить. Обязательно проверьте свойства основного вывода WindowsEventLogMaker, в частности измените параметр InstallerClass на False. ссылка - person LargeDachshund; 15.09.2016
comment
Привет, пожалуйста, кто-нибудь предложит мне, если потребуется, что-нибудь закодировать в классе установщика для этого? Потому что я получаю эту проблему и не могу решить ее без вашей помощи. Итак, пожалуйста, помогите мне. заранее спасибо - person dilipkumar1007; 16.05.2017
comment
Я сделал то же самое. Проблема в том, что перед тем, как нажать кнопку «ОК» на последнем экране во время установки, приложение запускалось. Запускать приложение только и только тогда, когда я нажимаю кнопку ОК. Пожалуйста, помоги нам - person dilipkumar1007; 16.05.2017
comment
@sbenderli Привет! После завершения установки оконной формы MSI мои необработанные файлы (дизайн и кодирование) также отображаются в месте установки. Я разработал это приложение с помощью Visual Studio 2010. Установка создана успешно, но после установки MSI эта проблема возникает. Пожалуйста помогите. Заранее спасибо. - person dilipkumar1007; 02.08.2017

Решение от https://blogs.msdn.microsoft.com/astebner/2006/08/12/mailbag-how-can-i-customize-an-msi-in-the-visual-studio-setupdeployment-project/ добавляет флажок в конце установки, чтобы выбрать, хотите ли вы запускать приложение или нет. Вы можете изменить сценарий, чтобы он был проверен по умолчанию ... или даже скрыть его.

Большим преимуществом здесь является то, что приложение не будет работать с повышенными правами, как упоминал Морис Флэнаган.

Вам понадобится следующий скрипт:

// EnableLaaunchApplication.js <msi-file>
// Performs a post-build fixup of an msi to launch a specific file when the install has completed


// Configurable values
var checkboxChecked = true;         // Is the checkbox on the finished dialog checked by default?
var checkboxText = "Launch [ProductName]";  // Text for the checkbox on the finished dialog
var filename = "WindowsApplication1.exe";   // The name of the executable to launch - change this to match the file you want to launch at the end of your setup


// Constant values from Windows Installer
var msiOpenDatabaseModeTransact = 1;

var msiViewModifyInsert         = 1
var msiViewModifyUpdate         = 2
var msiViewModifyAssign         = 3
var msiViewModifyReplace        = 4
var msiViewModifyDelete         = 6



if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + " file");
    WScript.Quit(1);
}

var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view
var record

try
{
    var fileId = FindFileIdentifier(database, filename);
    if (!fileId)
        throw "Unable to find '" + filename + "' in File table";


    WScript.Echo("Updating the Control table...");
    // Modify the Control_Next of BannerBmp control to point to the new CheckBox
    sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BannerBmp'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.StringData(11) = "CheckboxLaunch";
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    // Resize the BodyText and BodyTextRemove controls to be reasonable
    sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BodyTextRemove'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.IntegerData(7) = 33;
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BodyText'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.IntegerData(7) = 33;
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    // Insert the new CheckBox control
    sql = "INSERT INTO `Control` (`Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help`) VALUES ('FinishedForm', 'CheckboxLaunch', 'CheckBox', '18', '117', '343', '12', '3', 'LAUNCHAPP', '{\\VSI_MS_Sans_Serif13.0_0_0}" + checkboxText + "', 'Line1', '|')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();



    WScript.Echo("Updating the ControlEvent table...");
    // Modify the Order of the EndDialog event of the FinishedForm to 1
    sql = "SELECT `Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering` FROM `ControlEvent` WHERE `Dialog_`='FinishedForm' AND `Event`='EndDialog'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.IntegerData(6) = 1;
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    // Insert the Event to launch the application
    sql = "INSERT INTO `ControlEvent` (`Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering`) VALUES ('FinishedForm', 'CloseButton', 'DoAction', 'VSDCA_Launch', 'LAUNCHAPP=1', '0')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();



    WScript.Echo("Updating the CustomAction table...");
    // Insert the custom action to launch the application when finished
    sql = "INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('VSDCA_Launch', '210', '" + fileId + "', '')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();



    if (checkboxChecked)
    {
        WScript.Echo("Updating the Property table...");
        // Set the default value of the CheckBox
        sql = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('LAUNCHAPP', '1')";
        view = database.OpenView(sql);
        view.Execute();
        view.Close();
    }



    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}



function FindFileIdentifier(database, fileName)
{
    var sql
    var view
    var record

    // First, try to find the exact file name
    sql = "SELECT `File` FROM `File` WHERE `FileName`='" + fileName + "'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    if (record)
    {
        var value = record.StringData(1);
        view.Close();
        return value;
    }
    view.Close();

    // The file may be in SFN|LFN format.  Look for a filename in this case next
    sql = "SELECT `File`, `FileName` FROM `File`";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    while (record)
    {
        if (StringEndsWith(record.StringData(2), "|" + fileName))
        {
            var value = record.StringData(1);
            view.Close();
            return value;
        }

        record = view.Fetch();
    }
    view.Close();
    
}

function StringEndsWith(str, value)
{
    if (str.length < value.length)
        return false;

    return (str.indexOf(value, str.length - value.length) != -1);
}

Отредактируйте файл, чтобы отобразить желаемое имя и имя исполняемого файла, поместите этот файл рядом с вашим проектом установки .vdproj и в postbuild добавьте следующую строку:

ВЫЗОВ cscript.exe $ (ProjectDir) EnableLaunchApplication.js $ (BuiltOuputPath)

person JayTee    schedule 30.11.2018
comment
Это действительно правильный ответ, особенно с учетом того, что мое приложение использует информацию для входа в AD, а установщик запускается от имени пользователя SYSTEM. Обратной стороной является то, что он не работает при тихой или пассивной установке. Теперь, чтобы разорвать этот js и посмотреть, смогу ли я в этом разобраться. - person Ricky; 14.08.2019
comment
У меня это не сработало, у меня ошибка 2810. Мне удалось найти этот SO-ответ stackoverflow.com/a/59469922/637783, который заставил меня использовать Orca и изменить файл JS, в который вставляется новый элемент управления CheckboxLaunch, чтобы он стал следующим элементом управления Line1 вместо CloseButton. Просто СОВЕТ по использованию Orca для отладки, если у вас возникнут трудности, потому что тогда скрипт работал идеально! - person jbtule; 04.01.2020
comment
В строке 71 файла js измените значение с CloseButton на Line1, и ошибка 2810 исчезнет, ​​а в форме появится флажок с Lauch AppName. Однако в Windows 10 приложение не запускается. Какие-либо предложения? - person Rahul Kate; 25.04.2020

Предупреждение: приложение будет запущено как учетная запись с высокими привилегиями, что повлияет на безопасность и удобство использования.

В Visual Studio 2010 здесь просто ...

Шаг 1. Добавьте новый класс установщика в проект приложения, который вы хотите запустить после установки, назовите его как хотите.

Шаг 2: Добавьте следующий код в класс установщика, который вы только что добавили, заменив MyApplication.exe своим именем.

Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)

    MyBase.Commit(savedState)
    System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(Me.Context.Parameters("AssemblyPath")) + "\MyApplication.exe")

End Sub

Скомпилируйте и вперед ...

person Jarrod    schedule 14.03.2013
comment
После завершения установки оконной формы MSI мои необработанные файлы (дизайн и кодирование) также отображаются в месте установки. Я разработал это приложение с помощью Visual Studio 2010. Установка создана успешно, но после установки MSI эта проблема возникает. Пожалуйста помогите. Заранее спасибо. - person dilipkumar1007; 02.08.2017
comment
Использование этого метода запустит новую программу с правами администратора, что, вероятно, нежелательно для безопасности. - person Kenneth M. Kolano; 28.05.2018

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

  1. Добавьте в свой проект класс Install;
  2. In the new class, override the Commit method, like Jarrod talked above.

    System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(this.Context.Parameters["AssemblyPath"]) + @"\MyApplication.exe");

  3. Теперь уловка: перейдите на панель «Настраиваемые действия» в проекте установщика и добавьте основной вывод вашего проекта в папки «Зафиксировать» и «Установить». Ничего не меняйте в свойствах. Так и будет работать. По умолчанию он получит класс установщика, в который вы вставили код в предыдущем пункте;
  4. Создайте свой установочный пакет и установите его. Вы должны заметить, что приложение запустится в конце;
  5. Просто закройте предупреждение об успешной установке и сделайте это.

Чтобы узнать больше об этом и о том, где я его взял, посетите это.

PS: Я сделал это с помощью VS2017 и Framework 2.0.

person Artur Gomes    schedule 26.04.2017
comment
Привет @Artur, я сделал то же самое. Проблема в том, что перед тем, как нажать кнопку «ОК» на последнем экране во время установки, приложение запускалось. Запускать приложение только и только тогда, когда я нажимаю кнопку ОК. Пожалуйста, помоги нам. - person dilipkumar1007; 16.05.2017
comment
Привет @ dilipkumar1007. Вы пытались переопределить метод OnAfterInstall? Я не уверен в этом. Если есть какие-то результаты, поделитесь, пожалуйста. Обновление: Нет ... поведение такое же ... - person Artur Gomes; 17.05.2017
comment
Привет @ dilipkumar1007. После моего последнего ответа я провел несколько поисков и, думаю, наконец, получил нужное вам поведение. Я пробовал использовать fire.eagle aproach ниже, используя шаги в эта ссылка здесь. В моем случае мне пришлось удалить все кавычки в скрипте PostBuildEvent. (...) - person Artur Gomes; 17.05.2017
comment
(...) После этого и перестройки моего проекта установки в процессе установки будет последняя страница для открытия приложения? что будет сделано после того, как вы завершите установку приложения. - person Artur Gomes; 17.05.2017
comment
Еще одна вещь. Используя этот метод, вы можете избавиться от этих классов Custom Actions и Setup, поскольку сценарий сделает все за вас. Надеюсь, это то, что вы ищете. - person Artur Gomes; 17.05.2017
comment
Привет, @Artur Gomes! Спасибо за предложение. Но это не работает. Его оставаться таким же. - person dilipkumar1007; 19.05.2017
comment
Привет, @Artur Gomes, у меня такой же код в PostBuildEvent, и кавычки не удалялись. Но проблема такая же. Запущенное приложение перед нажатием кнопки закрытия. - person dilipkumar1007; 19.05.2017
comment
Привет @ dilipkumar1007. Вы скопировали имя файла EnableLaunchApplication.js в папку проекта установки? Перейдите по ссылке, указанной в пункте 1 эта статья. (...) - person Artur Gomes; 19.05.2017
comment
(...) после этого вы должны заменить var filename в верхней части скрипта на имя вашего исполняемого файла (файла, который вы хотите запустить). Не забудьте заполнить PostBuildEvent в свойствах проекта установки указанной строкой cscript.exe $(ProjectDir)EnableLaunchApplication.js $(BuiltOuputPath). У меня работает без кавычек. С кавычками выдаст ошибку при сборке пакета msi. - person Artur Gomes; 19.05.2017
comment
Привет, @Artur Gomes Спасибо за вашу любезную поддержку. Но я хотел бы сказать, что я добавил те же вещи, что предлагает данная ссылка, а также привяжу сценарий PostBuildEvent с кавычками, потому что без кавычек он вызывает код ошибки 1. - person dilipkumar1007; 23.05.2017
comment
Привет @ dilipkumar1007. Нет проблем. Действительно странно. В моем случае с кавычками выдает ошибку code 1. Возможно, в строке пути, которую вы используете, есть пробелы или недопустимые символы. Кроме того, правильно ли вы пишете имя исполняемого файла в верхней части скрипта? (прошу на всякий случай, извините). Можете ли вы попробовать построить свой установочный проект по пути без пробелов? - person Artur Gomes; 23.05.2017
comment
Привет, @Artur Gomes, я пробовал все аспекты, о которых вы упомянули, но безуспешно. Можем ли мы поговорить по адресу [email protected], если у вас нет проблем, сэр? - person dilipkumar1007; 24.05.2017
comment
Привет @ dilipkumar1007. Извините, я поздно отвечаю. Пробовали ли вы варианты, упомянутые в этом сообщении? Они объясняют некоторые изменения в сценарии, чтобы решить несколько проблем, и, возможно, они решили ошибку кода 1. - person Artur Gomes; 31.05.2017
comment
Привет @Artur! После завершения установки MSI-окна в форме окна мои необработанные файлы (дизайн и кодирование) также отображаются в месте установки. Я разработал это приложение с помощью Visual Studio 2010. Установка создана успешно, но после установки MSI эта проблема возникает. Пожалуйста помогите. Заранее спасибо. - person dilipkumar1007; 02.08.2017
comment
Привет @ dilipkumar1007. Вы добавили эти файлы в установочный пакет? Если вы этого не хотите, то не должны. В конце концов, в основном вам просто нужен основной вывод для ваших исполняемых проектов в решении и любые другие дополнительные файлы, которые вам понадобятся в производстве. Проверьте, что вы выбрали для добавления в проект установки. - person Artur Gomes; 03.08.2017

Попробуйте проверить это сообщение в блоге: http://blogs.msdn.com/b/astebner/archive/2006/08/12/696833.aspx

Я не могу засвидетельствовать, работает ли это в 2010 году или нет; Я все еще застрял на 2008, пока мой сервер TFS не будет обновлен. Также я использую WiX для своих установщиков. Но это просто настраиваемое действие, поэтому я думаю, что его все же следует поддерживать.

Надеюсь это поможет!

(Между прочим, пока я практиковался в поиске этого в Google, ваш вопрос появлялся на первой странице Google для этого вопроса.)

person fire.eagle    schedule 02.07.2010
comment
Хех. Мне не сообщалось, что кто-то ответил на всплывающее окно вверху. Предлагаю воспользоваться решением sbenderli. Намного проще, чем сообщение в блоге. - person fire.eagle; 03.07.2010
comment
Спасибо! Я подумываю о том, чтобы изучить WiX, поскольку читал о нем кое-что хорошее. - person ThaKidd KG5ORD; 03.07.2010

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

Вы бы добавили один из стандартных диалоговых окон в свой проект установки, что-то вроде CheckBoxes (A), щелкнув правой кнопкой мыши кнопку «Пуск» в представлении пользовательского интерфейса. После добавления щелкните правой кнопкой мыши диалоговое окно, чтобы переместить его вверх. Вам нужен только один флажок, чтобы задать вопрос о запуске программы, поэтому удалите остальные. Имя свойства по умолчанию - CHECKBOXA1, поэтому добавьте условие к настраиваемому действию, которое запускает ваш код CHECKBOXA1 = 1, что означает, что оно было проверено.

person PhilDW    schedule 06.12.2015

сначала сгенерируйте класс установщика. в этом переопределите метод установки. и вставьте следующую команду.

  public override void Install(IDictionary stateSaver) {
        
    System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(this.Context.Parameters["AssemblyPath"]) + @"\windowsAgent.exe");   
              
 }
person Hirusha Randunu    schedule 29.06.2021