4

ソフトウェアをインストールする前に、一部の Windows 機能が有効になっているかどうかを確認する必要があります。

dismコマンドラインツールを使用して確認またはインストールできます。

これを行うカスタム アクションを作成しますが、「WIX ネイティブの方法」でそれを行う方法はありますか?

<Property Id="dism" Value="dism.exe" />
<CustomAction Id="InstallMSMQContainer" Property="dism" ExeCommand=" /online /enable-feature /featurename:MSMQ-Container /featurename:MSMQ-Server /featurename:MSMQ-ADIntegration" Return="check" Impersonate="yes"  Execute="oncePerProcess"/>

<InstallUISequence>
  <Custom Action="InstallMSMQContainer" After="CostFinalize" Overridable="yes">NOT Installed</Custom>
</InstallUISequence>

問題は、コマンドがコマンド プロンプトを起動することです。これは、エンド ユーザーにとって非常に見苦しいものです。どうすれば綺麗にできますか?これを行うためにブートストラップが必要かどうかはわかりません (.NET Framework のインストールなど)。

それを管理する拡張機能はありますか?

現在、WIX 3.7 を使用しています。

4

3 に答える 3

6

David Gardiner の答えは、私の場合の正しい解決策を示唆していました。独自のカスタム アクションを作成する必要はありません。Windows の 64 ビット インストールでこれを行う方法は次のとおりです。

まず、MSMQ がインストールされているかどうかを確認します。

<Property Id="MSMQINSTALLED">
  <RegistrySearch Id="MSMQVersion" Root="HKLM" Key="SOFTWARE\Microsoft\MSMQ\Parameters" Type="raw" Name="CurrentBuild" />
</Property>

カスタム アクションを宣言します。2つ必要です。1 つはプロパティを dism へのパスに設定し、もう 1 つはそれを実行します。

<CustomAction Id="InstallMsmq_Set" Property="InstallMsmq" Value="&quot;[System64Folder]dism.exe&quot; /online /enable-feature /featurename:msmq-server /all" Execute="immediate"/>
<CustomAction Id="InstallMsmq" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check"/>

最後に、インストール シーケンスでカスタム アクションを指定します。

<InstallExecuteSequence>
  <Custom Action="InstallMsmq_Set" After="CostFinalize"/>
  <Custom Action="InstallMsmq" After="InstallInitialize">NOT REMOVE AND NOT MSMQINSTALLED</Custom> 
</InstallExecuteSequence>

これには少し時間がかかる可能性があるため、インストーラーのステータス テキストを更新するために次を追加しました。

<UI> 
  <ProgressText Action="InstallMsmq">Installing MSMQ</ProgressText> 
</UI> 

インストールの失敗時に MSMQ を削除する場合は、ロールバック アクションを指定することもできます。

于 2014-11-24T17:44:01.913 に答える
1

私のやり方は、dism.exe プロセスを呼び出す DTF カスタム アクションを作成することです。同じ結果が得られ、コマンド プロンプトは起動されません。

[CustomAction]
public static ActionResult RunDism(Session session)
{
    session.Log("Begin RunDism");
    string arguments = session["CustomActionData"];

    try
    {
        ProcessStartInfo info = new ProcessStartInfo();
        info.FileName = "dism.exe";
        session.Log("DEBUG: Trying to run {0}", info.FileName);
        info.Arguments = arguments;
        session.Log("DEBUG: Passing the following parameters: {0}", info.Arguments);
        info.UseShellExecute = false;
        info.RedirectStandardOutput = true;
        info.CreateNoWindow = true;

        Process deployProcess = new Process();
        deployProcess.StartInfo = info;

        deployProcess.Start();
        StreamReader outputReader = deployProcess.StandardOutput;
        deployProcess.WaitForExit();
        if (deployProcess.HasExited)
        {
            string output = outputReader.ReadToEnd();
            session.Log(output);
        }
        if (deployProcess.ExitCode != 0)
        {
            session.Log("ERROR: Exit code is {0}", deployProcess.ExitCode);
            return ActionResult.Failure;
        }
    }
    catch (Exception ex)
    {
        session.Log("ERROR: An error occurred when trying to start the process.");
        session.Log(ex.ToString());
        return ActionResult.Failure;
    }
    return ActionResult.Success;
}

DISM パラメーターは、カスタム アクション データを介して設定されます。

于 2013-09-10T22:33:43.367 に答える