2012-04-02 15 views
4

.Netインストーラプロジェクトの一部として呼び出す必要があるツールを作成しました。FolderBrowserDialogが.NETインストーラプロジェクトにハングアップする

ユーザーにディレクトリを尋ねてから、自分の設定を更新する必要があります。

私は、ファイルチューDLGを表示するには、次のコードを使用します。私は、コマンドラインからツールを実行する場合

{ 
    FolderBrowserDialog dlg = new FolderBrowserDialog(); 

    dlg.Description = "Trace-Verzeichnis auswählen"; 
    dlg.ShowNewFolderButton = true; 

    if (DialogResult.OK == dlg.ShowDialog(this)) 
    { 
     tbTraceDir.Text = dlg.SelectedPath; 
    } 
} 

FolderBrowserDialogはOKを示しています。私はそれがVStudioを形成するか、コマンドラインから実行したとき、私は実行しています ...同じ動作:それはインストーラパッケージの一部として呼び出された場合 、インストーラクラスから、それはShowDialogの()

編集で無期限にハングアップします.Net 4(クライアントプロファイルではありません)

私は間違っていると思いますか?

マリオ

+0

インストーラの種類(msi、exe、Installerクラス) – KMoraz

+0

これはmsiパッケージで、このツールはプロジェクトのCustomActionから呼び出されます(また、インストーラクラスも独自に用意されています)。 –

+0

私はカスタムアクションの中で問題なくダイアログを表示しています。新しいプロジェクトからそれを再現してみてください。 – leppie

答えて

1

おかげで問題がカスタムアクションユーザの入力を待ち(無限)が、SYSTEMアカウントの下でその実行です。

UIアクセスが必要なカスタムアクションは、ユーザーアカウントを偽装するImmediate executeを使用してUIシーケンスにスケジュールする必要があります。

WiX例:

<CustomAction Id='FooAction' 
       BinaryKey='FooBinary' 
       DllEntry='FooEntryPoint' 
       Execute='immediate' 
       Return='check'/> 

<Binary Id='FooBinary' SourceFile='foo.dll'/> 

<InstallUISequence> 
    <Custom Action='FooAction' After='AppSearch'></Custom> 
</InstallUISequence> 
+0

どうすれば設定できますか? –

+0

どのようにmsiを作成しましたか?私はいくつかのWiXの例を更新しました – KMoraz

+0

情報ありがとう!私はビジュアルスタジオ10のセットアッププロジェクトを使用してmsiを構築しました。 –

1

今日は同様の問題がありました。私は次のコードを持っていました:

using System; 
using System.Windows.Forms; 

class dummy{ 

    public static void Main() { 
     FolderBrowserDialog f = new FolderBrowserDialog(); 
     f.SelectedPath = System.Environment.CurrentDirectory; 
     f.Description= "Select a folder, for great justice."; 
     f.ShowNewFolderButton = true; 
     if(f.ShowDialog() == DialogResult.OK) { 
      Console.Write(f.SelectedPath); 
     } 
    } 
} 

いいでしょうか?それはコンパイルされ、エラーなしでリンクされていますが、結果として得られる実行可能ファイルは、フォルダチューザを表示することなくハングアップします。

[STAThread]Main()の前に追加すると修正されました。

using System; 
using System.Windows.Forms; 

class dummy{ 
    [STAThread] 
    public static void Main() { 
     FolderBrowserDialog f = new FolderBrowserDialog(); 
     f.SelectedPath = System.Environment.CurrentDirectory; 
     f.Description= "Select a folder, for great justice."; 
     f.ShowNewFolderButton = true; 
     if(f.ShowDialog() == DialogResult.OK) { 
      Console.Write(f.SelectedPath); 
     } 
    } 
} 

これで、フォルダブラウザウィンドウが正しくレンダリングされます。

+0

私はそれを確認しますが、私はStudio自身が作成したフォームアプリだと思うので、正しく設定する必要がありますが、確認します。 –

+0

問題は彼がMSI Setupプロジェクトにあり、Mainメソッドがないことです。 – Peter

2

私はこのボートを見逃していたようですが、私は似たようなものを探していました。found an excellent answer that actually worksと私は理由も説明します。インストーラプロジェクトに新しいカスタムアクションを追加する必要があります。次に、あなたがする必要があるだろう、すべてがある:あなたがちょうどあなたが新しいスレッドの内部で欲しいものを行うことができ、

[CustomAction] 
public static ActionResult SpawnBrowseFolderDialog(Session session) 
{ 
    Thread worker = new Thread(() => 
    { 
     FolderBrowserDialog dialog = new FolderBrowserDialog(); 
     dialog.SelectedPath = session["INSTALLFOLDER"]; 
     DialogResult result = dialog.ShowDialog(); 
     session["INSTALLFOLDER"] = dialog.SelectedPath; 
    }); 
    worker.SetApartmentState(ApartmentState.STA); 
    worker.Start(); 
    worker.Join(); 
    return ActionResult.Success; 
} 

それとも、新しいスレッドを割り当てる必要があるので...本当に、この作品理由は、 STAアパートの状態が必要です。 WindowsのUIコンポーネントは通常、単一のスレッド(STA)アパートメント状態で実行する必要があります。これは、一度に1つのスレッドでUIを変更することが許可されているため、UIコンポーネントに対して適切な同時実行を強制するためです。

関連する問題