2017-06-13 4 views
0

私はこの答え以下、デフォルトのWiXのProgressDlgのカスタムステータスメッセージを表示しようとしているのカスタムステータスメッセージを示しています。これまでのところ、私は私のカスタムアクションでこのコードを持ってウィックスは、ProgressDlg

WiX: dynamically changing the status text during CustomAction

<Binary Id="CuCustomInstallActionsBinary" SourceFile="$(var.ConsoleApplication1_TargetDir)CustomAction1.CA.dll" /> 
<CustomAction Id="CuCustomActionOnAfterInstall" BinaryKey="CuCustomInstallActionsBinary" DllEntry="CustomAction1" Execute="deferred" HideTarget="no" Return="check" Impersonate="no" /> 

    <InstallExecuteSequence> 
     <Custom Action="CuCustomActionOnAfterInstall" Before="InstallFinalize"><![CDATA[(NOT Installed) AND (NOT REMOVE)]]></Custom> 
    </InstallExecuteSequence> 

public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult CustomAction1(Session session) 
     { 
      Debugger.Launch(); 
      session.Log("Begin CustomAction1"); 
      MessageTest(session); 
      return ActionResult.Success; 
     } 


     private static void MessageTest(Session session) 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       using (Record r = new Record(0)) 
       { 
        r.SetString(0, $"Hello worls {i}"); 
        session.Message(InstallMessage.ActionData, r); 
       } 
       Thread.Sleep(1000); 
      } 
     } 
    } 

そして、Product.wxsに下記のXMLフラグメントを有します

しかし、UIに何も表示されていません。カスタムアクションが実行されている間、ステータスメッセージは空のままです。

Empty status message

これをacomplishするために行われるべき何か他のものはありますか?たぶんこれを書いて<Subscribe Event="ActionData" Attribute="Text" />このために独自のカスタムProgressDlgを実装する必要はありますか?

+0

MSIのActionTextテーブルを使用して、カスタムアクションごとに1つのカスタムメッセージを適用できます。 – jbudreau

+0

@jbudreau私が理解している限り、ActionTextは現在のアクション名を表示しますが、代わりにカスタムメッセージを表示する必要があるため、ActionDataが必要です。 – Oscar

+0

ActionTextテーブルを見ると、3つの列があります。実行中のカスタムアクションの名前に一致します)、 'Description'(カスタマイズされた/ローカライズされた表示文字列を配置する場所)、 'Template'(MSIログファイルにActionDataを出力するために使用されます)完成したMSIファイルを開き、ActionTextテーブルを参照して、各列のデータがどのように読み込まれるかを確認します。 – jbudreau

答えて

1

@jbudreauのヒントの後に答えが見つかりました。 Recordインスタンスには3つのフィールドがあり、ActionText msiテーブルの列の数と同じです。最初のフィールドはカスタムアクション名に設定しなければならず、2番目のUIメッセージは私の場合は使用されないテンプレート値です。また、session.Message()への呼び出しには、パラメータInstallMessage.ActionStartを含める必要があります。だから、最終的なコードは次のとおりです。

public void UpdateStatus(string message) 
{ 
    using (Record r = new Record(3)) 
    { 
    r.SetString(1, "CuCustomActionOnAfterInstall"); 
    r.SetString(2, message); 
    session.Message(InstallMessage.ActionStart, r); 
    } 
} 

それはActionTextにエントリを持つことが必要だ場合、私は、製品のタグ内ProgressTextファイルProduct.wxsに配置することによって達成されたものを、テストしていません。これがなければ、結果のmsiファイルにはActionTextテーブルが含まれません。

<UI> 
     <ProgressText Action="CuCustomActionOnAfterInstall">Running post install configuration.</ProgressText> 
</UI> 
関連する問題