6

我正在 PowerShell 中的 GUI 上工作,当单击某些组合框时我会抛出错误。

抛出错误后,我可以放下组合框列表并查看其内容,但如果我转移到同一个 datagridview 上的另一个组合框,我会在看到下拉列表之前得到相同的初始错误。

我在 TechNet PowerShell 论坛上发布了这个,并得到了我需要在单线程单元 (STA) 中运行我的 GUI 的答案。默认情况下,PowerShell 在 MTA 中运行,但您可以-STA在调用powershell.exe.

但是,我的 GUI 只是调用默认的 PowerShell 应用程序(在 MTA 模式下),所以我的问题是,有没有办法从我的 GUI/脚本内部以编程方式设置公寓状态?

如果没有,我的下一个尝试将是检测公寓状态并尝试从我的 gui 的初始加载中重新启动我的 GUI,例如:

powershell.exe -STA myguiprog.ps1

编辑:

所以我的解决方法确实有效:

if ([threading.thread]::CurrentThread.GetApartmentState() -eq "MTA") {
    & $env:SystemRoot\system32\WindowsPowerShell\v1.0\powershell.exe -sta $MyInvocation.ScriptName
}
4

2 回答 2

7

如果您安装了pscx,则可以使用Invoke-Apartment -Apartment STA -Expression { .... }.

如果没有,请查看WPF 和 PowerShell – 第 1 部分(Hello World 和欢迎来到 WPF 周),其中 James 使用 STA 创建运行空间。另一个来源可能是PowerShell 中的异步性

或者一些关于PowerShell V1 中自定义 cmdlet 单线程单元的旧帖子。

于 2011-06-15T20:22:48.593 回答
1

你可以“只使用 Invoke-Apartment”是一个相当油嘴滑舌的答案,因为它不随 Powershell 一起提供。开发人员也不应该假设他们编写的代码将始终位于所有者花时间安装 pscx 的机器上。

如果您愿意更改原始环境,则启动 Powershell 的解决方法有效。我只使用 PS ISE,因此从 PS 重新驱动我的代码会改变我的体验。我也不喜欢我认为 PS 存在的硬编码。有一天,Microsoft 可能会更改 V1.0(在 V2 和 V3 中继续使用它!)所以您应该真正以编程方式找到用户开始的内容并使用它。以及传递传递给您的任何参数。更糟糕的是,当我转到开始/附件/Powershell 时 - 我有四种 PS 选择来运行。编码的解决方法迫使我做出了一个我可能没有选择的选择。

于 2013-04-14T12:16:19.787 回答