2011-11-30 12 views
5

Tengo una clase de C# que debe ejecutar un script de Powershell pasándole un objeto de registro. El registro está escrito completamente en C#, y debe ser compartido a través del código C# y Powershell para lograr un registro común.Pase un objeto personalizado de C# a Powershell

¿Puede alguien decirme cómo puedo pasar el objeto personalizado de C# a Powershell y usarlo allí?

+0

¿Es sólo tiene que pasar la clase o una instancia? – JNK

+0

Una instancia de registro. – naspras

Respuesta

1

Puede compartir una clase entre PowerShell y C# mediante la compilación de su clase Log en un ensamblaje y utilizar LoadFile en PowerShell (debería funcionar en V1 y V2)

$lib = [System.Reflection.Assembly]::LoadFile('path to your dll'); 
$lib.Log("Terrible things have happened!") 

Sin embargo, si desea compartir una instancia de una clase entre PowerShell y C# podría usar SessionStateProxy.SetVariable.

+0

Assembly.LoadFile devuelve un ensamblado, por lo que creo que falta una línea aquí. También considere 'Add-Type -Path'. –

1

Si solo necesita utilizar la clase en un script de powershell, puede poner el código C# real en el script y usarlo como la definición de un tipo.

There is a tutorial here.

Básicamente se utilizan Add-Type -TypeDefinition <C# code> -Language CSharp

+0

Mi caso es un poco diferente. La secuencia de comandos de Powershell vive en un archivo fuera del programa C# y necesito llamar a este archivo con Log como parámetro. – naspras

0

agregar la referencia a system.management.automation.dll a su proyecto y utilice el PowerShell Class. Vea el ejemplo allí, es casi listo, cambie la línea

ps.AddCommand("Get-Process"); 

a algo como:

ps.AddCommand(<script-path/name-of-script-in-path>).AddParameter("Log", logInstance); 

Se dice que invoque el script con el parámetro Log cuyo valor es una instancia logInstance estar pasado en el guion El guión debe tener el parámetro Log y utilizarlo como $Log en su código:

param($Log) 

$Log.Write("Begin ...") 
... 
$Log.Write("End ...") 
+0

Voy a probar esto. ¿Puede decirme cómo puedo acceder al parámetro pasado desde el propio script de Powershell? – naspras

+0

@naspras - He agregado esto para responder. –

2

creo que el uso de espacio de ejecución va a resolver su problema. Una buena explicación y ejemplos sobre ellos se pueden encontrar en el siguiente enlace: http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C.

Solo una idea genérica de cómo usarlos.

si tiene guión:

param($logger2) 
$logger2.Write("logger2 Write was called"); 
$logger.Write("logger Write was called"); 

y desea subsitute logger2 y el registrador de uso siguiente código:

String scriptContent = // get script content 
Logger logger = new Logger(); 
Logger2 logger2 = new Logger2(); 
// create ps runspace 
using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    // start session 
    runspace.Open(); 
    // set variables 
    runspace.SessionStateProxy.SetVariable("logger", logger); 
    // supply commands 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     // create ps representation of the script 
     Command script = new Command(scriptContent, true, false); 
     // suppy parameters to the script 
     script.Parameters.Add(new CommandParameter("logger2", logger2)); 
     // send script to pipeline 
     pipeline.Commands.Add(script); 
     // execute it 
     Collection<PSObject> results = pipeline.Invoke(); 
     // close runspace 
     runspace.Close(); 
    } 
} 
Cuestiones relacionadas