有没有办法以编程方式将ApartmentState设置为STA?

时间:2011-06-15 18:56:26

标签: .net powershell sta

我正在使用PowerShell中的GUI工作,在点击某些组合框时我会抛出错误。

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

我在TechNet PowerShell论坛中发布了这个,并获得了在单线程单元(STA)中运行GUI所需的答案。默认情况下,PowerShell在MTA中运行,但您可以在调用-STA时使用powershell.exe开关覆盖此内容(在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
}

2 个答案:

答案 0 :(得分:7)

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

如果没有,请查看James为STA创建运行空间的WPF & PowerShell – Part 1 ( Hello World & Welcome to the Week of WPF )。另一个来源可能是Asynchronicity in PowerShell

关于自定义cmdlet Single Threaded Apartment in PowerShell V1的一些旧帖子。

答案 1 :(得分:1)

你可以'只使用Invoke-Apartment'是一个很好的答案,因为它没有Powershell。开发人员也不应该假设他们编写的代码总是在所有者花时间安装pscx的机器上。

如果您愿意改变原始环境,那么启动Powershell的解决方法是有效的。我专门使用PS ISE,因此从PS重新编写代码会改变我的经验。我也不喜欢我认为PS生活的硬编码。有一天微软可能会改变V1.0(而不是继续使用它来安装V2和V3!)所以你应该以编程方式找到用户启动和使用它的内容。以及传递给您的任何参数。为了使问题更严重,当我进入Start / Accessories / Powershell时 - 我有四种PS可供选择。编码的解决方法强制我可能没有选择的选择。