2011-06-15 17 views
6

Estoy trabajando en una GUI en PowerShell donde arrojaba errores cuando se hacía clic en ciertos cuadros combinados.¿Hay alguna manera de establecer programáticamente el ApartmentState en STA?

Después de que se produjo el error, podía soltar la lista de combobox y ver su contenido, pero si cambiaba a otra combox en la misma vista de tabla de datos, obtendría el mismo error inicial antes de poder ver la lista desplegable .

Publiqué esto en los foros de TechNet PowerShell y obtuve la respuesta que necesitaba para ejecutar mi GUI en un apartamento de una sola hebra (STA). PowerShell, de forma predeterminada, se ejecuta en MTA, pero puede sobrescribirlo (en v2.0) utilizando el interruptor -STA al llamar al powershell.exe.

Sin embargo, mi GUI simplemente invoca la aplicación predeterminada de PowerShell (en modo MTA) así que mi pregunta es, ¿hay alguna manera de establecer programáticamente el apartamiento de apartamentos desde dentro de mi GUI/script?

Si no es así, mi siguiente intento sería detectar el estado de apartamento y tratar de volver a tiro de mi interfaz gráfica de usuario de la carga inicial de mi interfaz gráfica de usuario con algo como:

powershell.exe -STA myguiprog.ps1 

Editar:

Así que mi solución no trabajo:

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

Respuesta

7

Si tiene pscx instalado, puede utilizar Invoke-Apartment -Apartment STA -Expression { .... }.

Si no, echa un vistazo a WPF & PowerShell – Part 1 (Hello World & Welcome to the Week of WPF) donde James crea el espacio de ejecución con STA. Otra fuente podría ser Asynchronicity in PowerShell.

O algunas publicaciones más antiguas sobre el cmdlet personalizado Single Threaded Apartment in PowerShell V1.

+0

no es una respuesta directa interna de PowerShell, pero sí tiene una respuesta AN y, dado que usted es la única respuesta y estoy satisfecho con mi trabajo, ¡usted gana! = D gracias por la publicación stej! – thepip3r

+0

Simplemente llame a 'Invoke-Appartment -expression {..}' para la parte de la GUI. Eso debería funcionar. – stej

1

Puede 'simplemente usar Invoke-Apartment' es una respuesta bastante simplista ya que no viene con Powershell. Tampoco debe un desarrollador asumir que el código que escribió siempre estará en una máquina donde el propietario se tomó el tiempo para instalar pscx.

La solución para iniciar Powershell funciona si está dispuesto a modificar el entorno original. Uso el PS ISE exclusivamente, por lo que redirigir mi código de PS cambia mi experiencia. Tampoco me gusta la codificación difícil donde creo que vive PS. Algún día, Microsoft podría cambiar V1.0 (más bien alféizar para seguir usándolo para V2 y V3), por lo que realmente debería encontrar programáticamente lo que el usuario comenzó y usar. Además de pasar cualquier parámetro que se le haya pasado. Para empeorar el problema, cuando voy a Inicio/Accesorios/Powershell: tengo cuatro opciones de PS para ejecutar. La solución codificada obliga a una elección que quizás no haya elegido.

Cuestiones relacionadas