office - Envolturas de interfaz COM en PowerShell?
skype for business powershell module (1)
Tengo el siguiente código en C # que trato de transferir a PowerShell. Pero no sé cómo portar este elenco:
((_ISkypeEvents_Event)skype).CallStatus += CallStatusHandler;
Si acabo de escribir [Skype4COM.ISkypeEvents_Event] en mi consola de PowerShell, obtengo:
No se puede encontrar el tipo [Skype4COM.ISkypeEvents_Event]: asegúrese de que esté cargado el ensamblaje que contiene este tipo.
Sin embargo, puedo obtener todos los miembros del objeto $ skype:
$skype = New-Object -ComObject Skype4COM.Skype
La siguiente línea no funciona:
$skypeevent = [Skype4COM._ISkypeEvents_Event]$skype
Si trato de llamar al método directamente en el objeto $ skype, así:
$skype.add_CallStatus({ write-host "yay" })
... (como se esperaba) me dice que:
La invocación del método falló porque [System .__ ComObject # {b1878bfe-53d3-402e-8c86-190b19af70d5}] no contiene un método llamado ''add_CallStatus''.
Intenté crear un contenedor COM, pero sigue sin obtener el tipo para la interfaz COM ...
¿Algunas ideas? ¡Muchas gracias!
PowerShell especial-trata los objetos COM con su propio "adaptador COM" de enlace posterior para exponer a los miembros a las personas que llaman (y al cmdlet Get-Member ). Lamentablemente, esto a veces falla si no puede encontrar la biblioteca de tipos asociada, lo que generalmente sucede cuando la instancia es realmente un objeto COM remoto que apareció en un tipo transparente.
Otro efecto secundario de esta adaptación de COM es que indirectamente se le impide usar este tipo de moldes para obtener acceso a los miembros. PowerShell generalmente expone la clase CoClass del conjunto de interoperabilidad (creado dinámicamente o PIA), que incluye miembros de todas las interfaces. De hecho, esta limitación en las interfaces no se limita a los objetos COM: el "Adaptador .NET" en PowerShell tampoco se ocupa de las viejas interfaces .NET. Para ser honesto, este es el comportamiento preferido en el 99% de los casos. PowerShell es un lenguaje dinámico y siempre expondrá el verdadero tipo de referencia en tiempo de ejecución. Cualquier intento de lanzar a una interfaz será ignorado.
Esto lleva a más problemas cuando llega a implementar interfaces explícitamente en C #. ¡PowerShell no puede verlos en absoluto! Hice un blog sobre una técnica para representar a los miembros de la interfaz explícita utilizando un módulo v2.0. Puedes probarlo contra una interfaz COM, pero no estoy seguro de que funcione.