Есть ли способ программно установить ApartmentState на STA? - PullRequest
6 голосов
/ 15 июня 2011

Я работаю над графическим интерфейсом в PowerShell, где я выдавал ошибки при нажатии определенных комбо-боксов.

После того, как ошибка была выдана, я мог бы опустить список выпадающих списков и посмотреть его содержимое, но если бы я переключился на другой комбокс в том же сетевом представлении данных, я бы получил ту же первоначальную ошибку, прежде чем смог увидеть раскрывающийся список.

Я разместил это на форумах TechNet PowerShell и получил ответ, который мне был необходим для запуска моего графического интерфейса в однопоточной квартире (STA). PowerShell по умолчанию работает в MTA, но вы можете перезаписать это (в v2.0), используя переключатель -STA при вызове powershell.exe.

Однако мой графический интерфейс просто вызывает приложение PowerShell по умолчанию (в режиме MTA) , поэтому мой вопрос, есть ли способ программно установить состояние квартиры изнутри моего GUI / скрипта?

Если нет, то моей следующей попыткой будет определить состояние квартиры и попытаться повторно запустить мой графический интерфейс с начальной загрузки моего интерфейса с помощью чего-то вроде:

powershell.exe -STA myguiprog.ps1

Edit:

Так что мой обход работает:

if ([threading.thread]::CurrentThread.GetApartmentState() -eq "MTA") {
    & $env:SystemRoot\system32\WindowsPowerShell\v1.0\powershell.exe -sta $MyInvocation.ScriptName
}

Ответы [ 2 ]

7 голосов
/ 16 июня 2011

Если у вас установлена ​​ pscx , вы можете использовать Invoke-Apartment -Apartment STA -Expression { .... }.

Если нет, взгляните на WPF & PowerShell - часть 1 (Привет, мир и добро пожаловать на неделю WPF) , где Джеймс создает пространство выполнения с помощью STA. Другим источником может быть Асинхронность в PowerShell .

Или несколько старых сообщений о пользовательских командлетах Однопоточные апартаменты в PowerShell V1 .

1 голос
/ 14 апреля 2013

Вы можете «просто использовать Invoke-Apartment» - довольно бойкий ответ, учитывая, что он не поставляется с Powershell.Разработчик также не должен предполагать, что написанный им код всегда будет находиться на компьютере, на котором владелец нашел время для установки pscx.

Обходной путь запуска Powershell работает, если вы готовы изменить исходную среду.Я использую исключительно PS ISE, поэтому перенаправление моего кода из PS меняет мой опыт.Мне также не нравится жесткое кодирование, где я думаю, что PS живет.Однажды Microsoft может изменить V1.0 (а не продолжать использовать его для V2 и V3!), Так что вы действительно должны программно найти то, что пользователь начал, и использовать это.А также передать любые параметры, которые были переданы вам.Чтобы усугубить проблему, когда я иду в Пуск / Аксессуары / Powershell - у меня есть четыре варианта запуска PS.Закодированный обходной путь делает выбор, который я, возможно, не выбрал.

...