Установщик Visual Studio> Как запустить приложение в конце установщика - PullRequest
44 голосов
/ 03 июля 2010

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

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

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

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

Ответы [ 6 ]

86 голосов
/ 03 июля 2010

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

  1. Щелкните правой кнопкой мыши по проекту установки, выберите «Пользовательские действия».
  2. Затем щелкните правой кнопкой мыши на Commit, Add Custom Action и выберите файл, который вы хотите запустить.(Обратите внимание, что он уже должен находиться в папке вашего приложения, что не должно быть проблемой в вашем случае, так как вы все равно запускаете свою программу.
  3. Просто выберите выходные данные вашего проекта.
  4. Затем нажмите на этот добавленный .exe и измените InstallerClass на false. Это очень важно, так как в противном случае он будет искать программу установки.
  5. Вы даже можете передать параметры в ваш .exe, добавив их в Аргументысвойство
7 голосов
/ 14 марта 2013

В 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

Компилируй и иди ...

4 голосов
/ 26 апреля 2017

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

  1. Добавьте класс Install в ваш проект;
  2. В новом классе переопределите метод Commit, как говорил Джаррод выше .

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

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

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

PS. Я сделал это с использованием VS2017 и Framework 2.0.

3 голосов
/ 03 июля 2010

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

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

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

(Кстати, во время практики поиска в Google, чтобы найти это, ваш вопрос показывална первую страницу Google по этому вопросу.)

1 голос
/ 30 ноября 2018

Решение от 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 + "', 'CloseButton', '|')";
    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 добавить следующую строку:

CALL cscript.exe "$ (ProjectDir) EnableLaunchApplication.js" "$ (BuiltOuputPath)"

0 голосов
/ 07 декабря 2015

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

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

...