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

问题描述

| 我正在PowerShell中的GUI上工作,单击某些组合框时会抛出错误。 引发错误后,我可以将组合框列表放下并查看其内容,但是如果我移到同一datagridview上的另一个comBox,则在看到下拉列表之前会遇到相同的初始错误。 我将此内容发布在TechNet PowerShell论坛上,并得到了在单线程单元(STA)中运行GUI所需的答案。认情况下,PowerShell在MTA中运行,但是您可以在调用ѭ1using时使用
-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
}
    

解决方法

        如果安装了pscx,则可以使用
Invoke-Apartment -Apartment STA -Expression { .... }
。 如果没有,请看一下WPF和PowerShell –第1部分(Hello World,欢迎来到WPF周),James在其中使用STA创建运行空间。另一个来源可能是PowerShell中的异步性。 或有关PowerShell V1中自定义cmdlet单线程公寓的一些较旧的文章。     ,        考虑到Powershell没有随附的内容,您可以“仅使用Invoke-Apartment”是一个不错的答案。开发人员也不应该假设他们编写的代码将始终位于所有者花时间安装pscx的计算机上。 如果您愿意更改原始环境,则启动Powershell的变通办法会起作用。我专用于PS ISE,因此从PS重新获取代码会改变我的经验。我还不喜欢PS所在的硬编码。有一天,Microsoft可能会更改V1.0(要在V2和V3上继续使用它,实在是不容易!),因此您应该以编程方式真正找到用户开始使用的内容并使用它。以及传递任何传递给您的参数。使问题变得更糟的是,当我转到“开始” /“附件” /“ Powershell”时,我有四种PS可供选择。编码的解决方法会强制执行我可能未选择的选择。