web-dev-qa-db-ja.com

Visual Studio Installer>インストーラーの最後にアプリを起動する方法

これはおそらく愚かな質問であり、私のグーグルは今日機能していません。

Visual Studio Installer> Setup Wizard projectを追加したアプリケーションがあります。インストールが成功した後にアプリケーションを起動するボタンまたはチェックボックスを追加する方法を考えています。これはMSI Installer Packageの最後のページVisual Studio 2010 Ultimateを使用しています。

これが必要なのは、アプリケーションが自動更新を行うときに、インストーラーが自動的に起動するようにするためです。更新後にアプリを再起動するにはインストーラーが必要です。

これはおそらく非常に単純ですが、私の人生にとってはわかりません。助けてくれてありがとう。

46
ThaKidd KG5ORD

インストールの完了後にアプリケーションを実行するには、

  1. セットアッププロジェクトを右クリックし、[カスタムアクション]をクリックします。
  2. 次に、[コミット]、[カスタムアクションの追加]を右クリックして、実行するファイルを選択します。 (アプリケーションフォルダーに既に存在している必要があることに注意してください。プログラムを実行しているので、これは問題になりません。
  3. プロジェクトの出力を選択するだけです。
  4. 次に、この追加された.exeをクリックして、InstallerClassをfalseに変更します。それ以外の場合はインストーラプログラムを探すため、これは重要です。
  5. パラメーターをArgumentsプロパティに追加して、.exeにパラメーターを渡すこともできます。
87
sbenderli

Visual Studio 2010では簡単です...

手順1:インストール後に実行するアプリケーションプロジェクトに新しいインストーラークラスを追加し、好きな名前を付けます。

Step2:追加したインストーラークラスに次のコードを追加します。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

コンパイルして...

7
Jarrod

私の場合、私はしばらくの間これと戦っていましたが、解決策はそこにありました。カスタムアクションを使用してアプリケーションのプライマリ出力に直接提供するソリューションは、メインアプリを終了するまでインストールアプリが残るため、私にとっては良くありませんでした。そのため、次のアプローチを使用して問題を解決できます。

  1. プロジェクトにインストールクラスを追加します。
  2. 新しいクラスで、Jarrodが説明したように、Commitメソッドをオーバーライドします 上記

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

  3. ここでの秘:は、インストーラープロジェクトの[カスタムアクション]ペインに移動し、プロジェクトのプライマリ出力を[コミット]および[インストール]フォルダーに追加することです。プロパティは何も変更しないでください。それはちょうどそのように動作します。デフォルトでは、前の時点で、コードを挿入したインストーラークラスを取得します。
  4. セットアップパッケージをビルドしてインストールします。アプリは最後に起動することに注意してください。
  5. インストールの成功の警告を閉じて、そのまま進みます。

これと私がどこで手に入れたかについてもっと知るには、 this にアクセスしてください。

PS .: VS2017とFramework 2.0を使用して作成しました。

4
Artur Gomes

このブログ投稿をチェックしてみてください: http://blogs.msdn.com/b/astebner/archive/2006/08/12/696833.aspx

2010年に機能するかどうかは証明できません。 TFSサーバーがアップグレードされるまで、2008年の使用を続けています。また、インストーラーにはWiXを使用しています。しかし、それは単なるカスタムアクションであるため、引き続きサポートする必要があると思います。

お役に立てれば!

(ちなみに、これを見つけるためにグーグルで練習していると、この質問に対する質問がGoogleの最初のページに表示されていました。)

3
fire.eagle

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)"

3
JayTee

前の回答が元の投稿のチェックボックスまたはボタンの質問に対応していないため、別の回答を追加します。

ユーザーインターフェイスビューの[スタート]ボタンを右クリックして、セットアップダイアログボックス(CheckBoxes(A)など)の1つを追加します。追加した後、ダイアログを右クリックして上に移動します。プログラムの実行について尋ねる質問のチェックボックスは1つだけなので、他のチェックボックスは削除します。デフォルトのプロパティ名はCHECKBOXA1であるため、チェックされたことを意味するコードCHECKBOXA1 = 1を起動するカスタムアクションに条件を追加します。

1
PhilDW