2017-10-06 2 views
0

Ist es möglich, DLL hinzuzufügen, die PowerShell-Cmdlet zu C# -Projekt implementiert und seine Funktionen aufrufen, wie Sie normalerweise mit Klassen tun? Das Problem besteht darin, dass das Cmdlet keine geeigneten Funktionen zum Aufrufen hat. Es hat invoke und andere Sachen stattdessen.Verwenden Sie Funktion von Powershell-Cmdlet dll

Soweit ich verstehe, einen anderen Weg, es zu tun ist System.Management.Automation Namespace zu verwenden. Aber ich befürchte, dass es zu Leistungseinbußen kommen wird, wenn ich die Funktion 7000 Mal hintereinander ausführen werde.

Um genau zu sein Ich habe ein Wohnheim wie Remove-NAVApplicationObjectLanguage für MS Dynamics Nav, die Dateien verarbeiten und 7000 Dateien zu verarbeiten. Ich möchte es in die Bibliothek einpacken und es mit meiner zusätzlichen Verarbeitung auf eine für mich bequeme Weise aufrufen.

+2

Der Leistungsaufwand eine Instanz des cmdlet in Code 7000 mal von Aufrufen würde nicht in der Befehlszeile von Aufrufen es 7000 mal verschieden sein. Um Ihre Frage zu beantworten: Nein, nicht direkt, die Cmdlet-Schnittstelle verwendet 'protected' Methoden, weshalb Sie' Invoke() 'nur dann sehen, wenn Sie eine Instanz einer Cmdlet-Klasse erstellen. –

Antwort

1

Microsoft stellte einen Blog-Artikel Coffee Break: Use the PowerShell Runner Add-In zur Verfügung, wie Sie ihre Dynamics NAV PowerShell-Cmdlets in Dynamics NAV ausführen können.

Wenn Sie das in C# verwenden möchten, können Sie die gleiche Microsoft.Dynamics.Nav.PowerShellRunner.dll verwenden. Es befindet sich im Add-Ins-Ordner der Servicestufe C: \ Programme \ Microsoft Dynamics NAV \ 100 \ Dienst \ Add-Ins \ PowerShellRunner.

C# Beispiel:

PowerShellRunner PowerShellRunner = PowerShellRunner.CreateInSandbox(); 
PowerShellRunner.WriteEventOnError = true; 

PowerShellRunner.ImportModule(@"C:\Program Files(x86)\Microsoft Dynamics NAV\100\RoleTailored Client\Microsoft.Dynamics.Nav.Apps.Tools.dll"); 

PowerShellRunner.AddCommand("Remove-NAVApplicationObjectLanguage"); 
string[] sources = new string[] { "TAB9.TXT", "TAB14.TXT" }; 
PowerShellRunner.AddParameter("Source", sources); 
PowerShellRunner.AddParameter("Destination", @".\RESULT"); 

PowerShellRunner.WriteEventOnError = true; 

PowerShellRunner.BeginInvoke(); 
+0

Nice one. Ich war mir dessen nicht bewusst, da ich diese Version von Nav noch nicht benutze. Dies unterscheidet sich jedoch nicht wesentlich von der Verwendung von 'System.Management.Automation'. Höchstwahrscheinlich ist es nur ein Wrapper um ihn herum. –