我正在使用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
}
答案 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可供选择。编码的解决方法强制我可能没有选择的选择。