2016-08-18 13 views
0

ダイアログ内からファイルを選択できます(ディレクトリではありません)。ボタンをクリックした後にカスタムアクションからOpenFileDialogを呼び出す

私は 'OpenFileDialog'を呼び出すカスタムアクションを作成しました。ここで

(私は継続するために、MSIプロセスを殺さなければならない)、私はボタンコントロールからカスタムアクションを呼び出していますし、それは完全にはまり込むかのように思わ は私のカスタムアクションです:

[CustomAction] 
     public static ActionResult BrowseForLicenseFile(Session session) 
     { 
      try 
      { 
       session.Log("Begin BrowseForLicenseFile"); 

       session["LICENSEFILE"] = string.Empty; 

       var dialog = new OpenFileDialog 
       { 
        Filter = "License File (license.dat)|license.dat", 
        InitialDirectory = @"C:\", 
        Title = "Select License File: license.dat" 
       }; 

       if (dialog.ShowDialog() == DialogResult.OK) 
       { 
        session["LICENSEFILE"] = dialog.FileName; 
        session.Log("setting property LICENSEFILE={0}", dialog.FileName); 
       } 
       else 
        return ActionResult.Failure; 
      } 
      catch (Exception ex) 
      { 
       session.Log("ERROR in custom action BrowseForLicenseFile {0}", ex.ToString()); 
       return ActionResult.Failure; 
      } 

      return ActionResult.Success; 
     } 

ボタンのコードは(私も2最後の「公開」行をコメントし、最初の一つだけ残してみました:

ここ
<Control Id="BrowseLicenseFile" Type="PushButton" Width="75" Height="17" X="274" Y="105" Text="{\VSI_MS_Sans_Serif13.0_0_0}Browse"> 
      <Publish Event="DoAction" Value="BrowseForLicenseFileCA" Order="1" >1</Publish> 
      <Publish Property="LICENSEFILE" Value="[LICENSEFILE]" Order="2">1</Publish> 
      <Publish Event="DoAction" Value="CopyLicenseFileToCommonDirCA" Order="3">1</Publish> 
     </Control> 

は、カスタムアクションが宣言されている方法です。

<CustomAction Id="BrowseForLicenseFileCA" BinaryKey="ServerInstallerCustomActions.CA" DllEntry="BrowseForLicenseFile" Execute="immediate" Return="check" /> 
    <CustomAction Id="CopyLicenseFileToCommonDirCA" BinaryKey="ServerInstallerCustomActions.CA" DllEntry="CopyLicenseFileToCommonDir" Execute="immediate" Return="check" /> 
<Binary Id="ServerInstallerCustomActions.CA" SourceFile="$(var.Server.TargetDir)\ServerInstallerCustomActions.CA.dll" /> 

プロパティは、空のように宣言されています

<Property Id="LICENSEFILE" /> 

私は、管理者権限でコマンドプロンプトからMSIを実行しています。

これが動作しない理由を誰かが理解できたらうれしいです。

+1

あなたはこれを試したことがありますか? http://stackoverflow.com/questions/37137579/file-browse-dialog-in-wix-installer – sttaq

+0

ありがとう!それは今働く。私は、別のスレッドからOpenFileDialogを呼び出さなければならないのかどうかはわかりませんでした....しかし、私は編集コントロールにセットされた値を取得しませんでした.... – Dafna

+0

あなたは 'session'オブジェクトを渡していますスレッド? – sttaq

答えて

0

私は他の人が使用するための答えを入れています:

[CustomAction] 
      public static ActionResult BrowseForLicenseFile(Session session) 
      { 
       try 
       { 
        Log(session, "Begin BrowseForLicenseFile"); 

        session["LICENSEFILE"] = string.Empty; 

        var task = new Thread(() => GetFile(session)); 
        task.SetApartmentState(ApartmentState.STA); 
        task.Start(); 
        task.Join(); 
        Log(session, "End OpenFileChooser Custom Action"); 

       } 
       catch (Exception ex) 
       { 
        Log(session, "ERROR in custom action BrowseForLicenseFile {0}", ex.ToString()); 

        return ActionResult.Failure; 
       } 

       return ActionResult.Success; 
      } 
    private static void GetFile(Session session) 
    { 
     var dialog = new OpenFileDialog 
     { 
      Filter = "License File (license.dat)|license.dat", 
      InitialDirectory = @"C:\", 
      Title = "Select License File: license.dat" 
     }; 

     if (dialog.ShowDialog() == DialogResult.OK) 
     { 
      session["LICENSEFILE"] = dialog.FileName; 
      Log(session, "setting property LICENSEFILE={0}", dialog.FileName); 
     } 
    } 
関連する問題