我编写了一个应作为.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。