2017-10-06 97 views
0

是否有可能將實現PowerShell cmdlet的DLL添加到C#項目並像通常那樣使用類來調用它的函數?問題是cmdlet沒有合適的函數來調用。它有invoke和其他的東西。從powershell cmdlet使用函數dll

據我所知,另一種方法是使用​​命名空間。但是,如果我連續運行7000次這樣的函數,恐怕會導致性能開銷。

確切地說,我有一個類似於Remove-NAVApplicationObjectLanguage的命令,用於處理要處理的文件和7000個文件的MS Dynamics Nav。我想將它包裝到庫中,並以我方便的方式通過附加處理來調用它。

+2

從代碼調用小命令的實例7000倍的性能開銷不會是從在命令行調用它7000倍不同。要回答你的問題:不,不是直接,cmdlet接口使用'protected'方法,這就是爲什麼你只能在創建一個Cmdlet類的實例時看到'Invoke()'的原因。 –

回答

1

Microsoft提供了博客文章Coffee Break: Use the PowerShell Runner Add-In如何從Dynamics NAV內運行Dynamics NAV PowerShell Cmdlet。

如果你喜歡在C#中使用它,你可以使用相同的Microsoft.Dynamics.Nav.PowerShellRunner.dll。它位於服務層C:\ Program Files \ Microsoft Dynamics NAV \ 100 \ Service \ Add-ins \ PowerShellRunner的加載宏文件夾中。

C#示例:

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

不錯的。沒有意識到這一點,因爲我還沒有使用這個版本的導航。但是這與使用'System.Management.Automation'沒有多大區別。很可能它只是一個包裝。 –