有没有一种编程方式可以将ApartmentState设置为STA?

6
我正在使用PowerShell开发一个GUI界面,在某些组合框被点击时会出现错误。当错误出现后,我可以展开组合框列表并查看其内容,但如果我转移到同一数据网格视图上的另一个组合框,则在看到下拉列表之前会再次出现相同的初始错误。
我在TechNet PowerShell论坛上发布了这个问题,并得到了答案:我需要在单线程公寓(STA)中运行我的GUI。默认情况下,PowerShell在MTA模式下运行,但您可以通过在调用powershell.exe时使用“-STA”开关来覆盖此设置(在v2.0中)。
然而,我的GUI只是调用默认的PowerShell应用程序(以MTA模式),所以我的问题是,是否有一种方法可以从我的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
}
2个回答

7

虽然这不是 PowerShell 内部的直接答案,但它确实有一个答案,而且由于你是唯一的回答者,我对我的解决方法感到满意,你赢了! =D 感谢 stej 的帖子! - thepip3r
只需调用 Invoke-Appartment -expression {..} 来处理 GUI 部分。那应该可以工作。 - stej

1
“你可以‘只需使用Invoke-Apartment’这样的回答有些轻率,因为它并不随Powershell一起提供。开发者也不应该假设他们编写的代码总是在安装了pscx的机器上运行。”
“启动Powershell的解决方法可以在愿意改变原始环境的情况下使用。我专门使用PS ISE,所以从PS重新驱动我的代码会改变我的体验。我也不喜欢在我认为PS存在的地方硬编码。有一天微软可能会更改V1.0(继续在V2和V3中使用它相当愚蠢!),所以你真的应该以编程方式找到用户启动的内容并使用它。同时传递任何传递给你的参数。更糟糕的是,当我去开始/附件/Powershell时,我有四个选择要运行的PS。编码解决方法强制我选择我可能没有选择的选项。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接