4

.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;
    }
}

コマンドラインからツールを実行すると、FolderBrowserDialogOK が表示されます。インストーラー パッケージの一部としてインストーラー クラスから呼び出された場合、ShowDialog() で無期限にハングします。

編集:VStudioまたはコマンドラインから実行したときと同じ動作....Net 4を実行しています(クライアントプロファイルではありません)

私が間違っている可能性のあるヒントはありますか?

ありがとう

マリオ

4

3 に答える 3

2

私はこれでボートを逃したようですが、似たようなものを探していて、実際に機能する優れた答えを見つけました.理由も説明します. インストーラー プロジェクトに新しいカスタム アクションを追加する必要があります。次に、行う必要があるのは次のとおりです。

[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 アパートメント状態を持つ必要がある新しいスレッドを割り当てる必要があるためです。一度に 1 つのスレッドだけが UI を変更できるため、Windows の UI コンポーネントは通常、シングル スレッド (STA) アパートメント状態で実行する必要があります。

于 2014-11-04T15:52:09.447 に答える
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]beforeを追加することでした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);
        }
    }
}

これで、フォルダー ブラウザー ウィンドウが適切に表示されるようになりました。

于 2013-04-03T13:29:05.127 に答える
1

問題は、カスタム アクションがユーザー入力を (無限に) 待機することですが、SYSTEM アカウントで実行されます。

UI アクセスが必要なカスタム アクションは、ユーザー アカウントを偽装する即時実行を使用して 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>
于 2012-04-02T19:44:33.523 に答える