Interaction entre Powershell et une application hôte .NET

Sujet inhabituel sur ce blog: l’interaction entre Powershell et une application hôte .NET. Les exemples disponibles sur MSDN montrent comment héberger des runspaces Powershell via les classes du namespace System.Management.Automation ; mais outre le simple hébergement de scripts, il est également possible de partager des objets entre les scripts Powershell hébergé et le code .NET, ouvrant ainsi la voie à des scénarios hybrides. Ceci permet, par exemple, le traitement par une application .NET d’objets mis à disposition via Exchange Management Shell (EMS).

Les interactions entre hôte .NET et runspace Powershell s’effectuent via la propriété Runspace.SessionStateProxy. Une fois une instance d’objet associé à une variable, les scripts s’exécutant dans ce runspace pourront y accéder comme à tout autre variable de la session Powershell :

rs.SessionStateProxy.SetVariable("myVariable", ic);

using (Pipeline pipeline = rs.CreatePipeline("$myVariable.SomeNumber = $myVariable.SomeNumber + 1"))

pipeline.Invoke();

Dans l’autre sens, récupérer dans l’hôte un objet instancié depuis script Powershell requiert le cast suivant

ic = (rs.SessionStateProxy.GetVariable("mySecondVariable") as PSObject).BaseObject as InstantiatedClass;

L’exemple de code joint montre ces opérations dans les deux sens, modifie des propriétés d’un objet, et effectue des appels de méthodes. Notez que l’exemple requiert une référence vers la DLL System.Management.Automation de Powershell.

Program.cs