gpt4 book ai didi

.net - FolderBrowserDialog 卡在 .Net 安装程序项目中

转载 作者:行者123 更新时间:2023-12-01 01:20:02 25 4
gpt4 key购买 nike

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

关于.net - FolderBrowserDialog 卡在 .Net 安装程序项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com