6

特定のコンボボックスがクリックされたときにエラーをスローしていたPowerShellのGUIで作業しています。

エラーがスローされた後、コンボボックスリストをドロップダウンしてその内容を確認できましたが、同じdatagridviewで別のコンボボックスに移動すると、ドロップダウンリストが表示される前に同じ初期エラーが発生しました。

これをTechNetPowerShellフォーラムに投稿し、GUIをシングルスレッドアパートメント(STA)で実行するために必要な回答を得ました。PowerShellは、デフォルトではMTAで実行されますが、を-STA呼び出すときにスイッチを使用することで、これを(v2.0では)上書きできますpowershell.exe

ただし、私のGUIは(MTAモードで)デフォルトのPowerShellアプリケーションを呼び出すだけなので、私の質問は、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
}
4

2 に答える 2

7

pscxがインストールされている場合は、を使用できますInvoke-Apartment -Apartment STA -Expression { .... }

そうでない場合は、WPFとPowerShell –パート1(Hello World&Welcome to the Week of WPF)をご覧ください。ここでは、JamesがSTAを使用してランスペースを作成しています。別のソースは、PowerShellの非同期性である可能性があります。

または、PowerShellV1のカスタムコマンドレットシングルスレッドアパートメントに関する古い投稿。

于 2011-06-15T20:22:48.593 に答える
1

Powershellが付属していないことを考えると、「Invoke-Apartmentを使用する」というのはむしろglibの答えです。また、開発者は、自分が書いたコードが、所有者がpscxのインストールに時間をかけたマシン上に常にあると想定してはなりません。

元の環境を変更する場合は、Powershellを起動するための回避策が機能します。私はPSISEを排他的に使用しているので、PSからコードを再ドライブすると私の経験が変わります。PSが存在すると思う場所でのハードコーディングも嫌いです。いつの日かMicrosoftはV1.0を変更するかもしれません(V2とV3でそれを使い続けるために!)ので、あなたは本当にプログラムでユーザーが始めたものを見つけてそれを使うべきです。渡されたパラメータを渡すだけでなく。問題をさらに悪化させるために、[スタート]/[アクセサリ]/[Powershell]に移動すると、実行するPSの選択肢が4つあります。コード化された回避策は、私が選択しなかった可能性のある選択を強制します。

于 2013-04-14T12:16:19.787 に答える