我编写了一个应作为.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显示为确定。
如果它是安装程序包的一部分,则从安装程序类中将其无限期地挂在ShowDialog()上

编辑:当我从VStudio或从命令行运行它时,行为相同...
我正在运行.Net 4(不是客户端配置文件)

有什么提示我可能做错了吗?

谢谢

马里奥

最佳答案

似乎我错过了这艘船,但是我正在寻找与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)套间状态下运行,因为这会强制在UI组件上进行适当的并发,因为一次只允许一个线程修改UI。

10-06 02:16