.net 有没有办法通过编程将ApartmentState设置为STA?

.net 有没有办法通过编程将ApartmentState设置为STA?,.net,powershell,sta,.net,Powershell,Sta,我正在PowerShell中开发一个GUI,单击某些组合框时会抛出错误 抛出错误后,我可以放下combobox列表并查看其内容,但如果在同一datagridview上切换到另一个combox,我将在看到下拉列表之前收到相同的初始错误 我在TechNet PowerShell论坛上发布了这篇文章,并得到了在单线程单元(STA)中运行GUI所需的答案。默认情况下,PowerShell在MTA中运行,但您可以在调用PowerShell.exe时使用-STA开关来覆盖它(在v2.0中) 但是,我的GUI

我正在PowerShell中开发一个GUI,单击某些组合框时会抛出错误

抛出错误后,我可以放下combobox列表并查看其内容,但如果在同一datagridview上切换到另一个combox,我将在看到下拉列表之前收到相同的初始错误

我在TechNet PowerShell论坛上发布了这篇文章,并得到了在单线程单元(STA)中运行GUI所需的答案。默认情况下,PowerShell在MTA中运行,但您可以在调用
PowerShell.exe
时使用
-STA
开关来覆盖它(在v2.0中)

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

如果没有,我的下一次尝试将是检测单元状态,并尝试从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
}
如果已安装,则可以使用
调用单元-单元STA-表达式{….}

如果没有,请看看James在何处使用STA创建运行空间。另一个来源可能是


或者一些关于定制cmdlet的老帖子。

考虑到Powershell没有附带“只需使用调用单元”这一选项,您的回答相当圆滑。开发人员也不应该假设他们编写的代码总是在所有者花时间安装pscx的机器上


如果您愿意更改原始环境,则启动Powershell的变通方法会起作用。我只使用PS ISE,因此从PS中删除代码会改变我的体验。我也不喜欢硬编码,我认为PS的生活。有一天,微软可能会改变V1.0(而不是继续在V2和V3中使用它!),所以你应该真正以编程的方式找到用户开始使用的东西并使用它。以及传递传递给您的任何参数。更糟糕的是,当我进入Start/Accessories/Powershell时,我有四种PS可供选择。编码的解决方案迫使我做出我可能没有选择的选择。

这不是PowerShell内部的直接答案,但它确实有答案,因为你是唯一的答案,我对我的解决方案感到满意,你赢了=D谢谢你的帖子stej!只需为GUI部分调用
Invoke Appartment-expression{..}
。这应该行得通。