2017-10-06 2 views
0

Est-il possible d'ajouter une DLL qui implémente la cmdlet PowerShell au projet C# et d'appeler ses fonctions comme vous le feriez normalement avec les classes? Le problème est que cmdlet n'a pas de fonctions appropriées à appeler. Il a invoke et d'autres choses à la place. Pour autant que je sache, une autre façon de faire est d'utiliser l'espace de noms System.Management.Automation. Mais je crains que cela ne cause des pertes de performances si je lance la fonction comme 7000 fois de suite.Utiliser la fonction de la cmdlet dll powershell

Pour être exact, j'ai des comdlets comme Remove-NAVApplicationObjectLanguage pour MS Dynamics Nav qui traitent les fichiers et 7000 fichiers à traiter. Je veux envelopper dans la bibliothèque et l'appeler avec mon traitement supplémentaire d'une manière pratique pour moi.

+2

Les frais généraux de performance d'invoquer une instance de l'applet de commande dans le code 7000 fois ne va pas être différent de l'invoquer 7000 fois à la ligne de commande. Pour répondre à votre question: non, pas directement, l'interface cmdlet utilise des méthodes 'protected', c'est pourquoi vous ne voyez que' Invoke() 'exposé lors de la création d'une instance d'une classe Cmdlet. –

Répondre

1

Microsoft a fourni un Article de blog Coffee Break: Use the PowerShell Runner Add-In pour exécuter ses Cmdlets Dynamics NAV PowerShell à partir de Dynamics NAV.

Si vous souhaitez utiliser cela en C#, vous pouvez utiliser le même Microsoft.Dynamics.Nav.PowerShellRunner.dll. Il se trouve dans le dossier des compléments du niveau de service C: \ Program Files \ Microsoft Dynamics NAV \ 100 \ Service \ Add-ins \ PowerShellRunner.

C# Exemple:

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. Je n'étais pas au courant de cela puisque je n'utilise pas encore cette version de Nav. Mais ce n'est pas très différent d'utiliser 'System.Management.Automation'. Très probablement, c'est juste un emballage autour d'elle. –