2011-06-15 172 views
6

我正在使用PowerShell的圖形用戶界面,當某些組合框被點擊時,我正在拋出錯誤。有沒有辦法以編程方式將ApartmentState設置爲STA?

發生錯誤後,我可以放下組合框列表並查看它的內容,但是如果我在同一個datagridview上移動到另一個組合框,我會在看到下拉列表之前得到相同的初始錯誤。

我在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 
} 

回答

7

如果您已經安裝pscx,您可以使用Invoke-Apartment -Apartment STA -Expression { .... }

如果不是,請查看WPF & PowerShell – Part 1 (Hello World & Welcome to the Week of WPF),其中James使用STA創建運行空間。另一個來源可能是Asynchronicity in PowerShell

或者一些關於自定義cmdlet的舊帖子Single Threaded Apartment in PowerShell V1

+0

這不是PowerShell內部的直接答案,但它確實有答案,因爲您是唯一的答案,我對我的解決方案感到滿意,您贏了! = D感謝post stej! – thepip3r 2011-06-16 18:35:39

+0

只需爲GUI部分調用'Invoke-Appartment -expression {..}'。這應該工作。 – stej 2011-06-17 05:32:38

1

考慮到它不包含在Powershell中,您可以'使用Invoke-Apartment'來回答一個問題。開發者也不應該假定他們編寫的代碼將永遠存在於所有者花時間安裝pscx的機器上。

如果您願意更改原始環境,則啓動Powershell的解決方法將起作用。我專門使用PS ISE,因此從PS重新啓動我的代碼改變了我的體驗。我也不喜歡硬編碼,我認爲PS的生活。有一天,微軟可能會改變V1.0(相當於繼續使用V2和V3!),所以你應該真正以編程方式找到用戶啓動和使用的內容。以及傳遞給你的任何參數。爲了讓問題變得更糟,當我去開始/附件/ Powershell - 我有四個選擇的PS運行。編碼解決方法強制我可能沒有選擇的選擇。

相關問題