2011-11-30 13 views
5

Mam klasę C#, która powinna wykonać skrypt Powershell, przekazując mu obiekt dziennika. Dziennik jest w całości napisany w języku C# i powinien być współużytkowany w całym kodzie C# i powłoce Powershell, aby uzyskać wspólne rejestrowanie.Przekaż niestandardowy obiekt z języka C# do powłoki Powershell

Czy ktoś może mi powiedzieć, jak mogę przekazać niestandardowy obiekt z C# do Powershell i użyć go tam?

+0

Czy wystarczy zdać klasę lub wystąpienie? – JNK

+0

Instancja dziennika. – naspras

Odpowiedz

1

Możesz dzielić klasę między PowerShell i C# kompilując swoją klasę Log w zespole i korzystać LoadFile w PowerShell (powinien działać w V1 i V2)

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

Jeśli jednak chcesz podzielić instancję klasy między PowerShell i C# można użyć SessionStateProxy.SetVariable.

+0

Assembly.LoadFile zwraca zespół, więc myślę, że brakuje tu linii. Weź również pod uwagę 'Add-Type -Path'. –

1

Jeśli potrzebujesz tylko użyć klasy w skrypcie powershell, możesz umieścić rzeczywisty kod C# w samym skrypcie i użyć go jako definicji dla typu.

There is a tutorial here.

Zasadniczo użyć Add-Type -TypeDefinition <C# code> -Language CSharp

+0

Moja sprawa jest trochę inna. Skrypt Powershell znajduje się w pliku spoza programu C# i muszę wywołać ten plik, gdy parametr Log. – naspras

0

dodać odwołanie do system.management.automation.dll do projektu i używać PowerShell Class. Patrz przykład tam, to jest prawie gotowy, zmienić linię

ps.AddCommand("Get-Process"); 

do czegoś podobnego:

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

Mówi do wywołania skryptu z parametrem Log których wartość jest instancją logInstance być przekazane w skrypcie. Skrypt powinien mieć parametr Log i używać go jako $Log w kodzie:

param($Log) 

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

Spróbuję tego. Czy możesz mi powiedzieć, w jaki sposób mogę uzyskać dostęp do przekazanego parametru z samego skryptu Powershell? – naspras

+0

@naspras - dodałem to, aby odpowiedzieć. –

2

Uważam go za pomocą runspace rozwiąże Twój problem. Dobre wyjaśnienie i przykłady na nich można znaleźć w następujący link: http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C.

Tylko ogólny pomysł, jak z nich korzystać.

jeśli masz skrypt:

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

i chcesz subsitute logger2 i rejestratora użycie następującego kodu:

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(); 
    } 
} 
Powiązane problemy