2017-10-06 108 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'没有多大区别。很可能它只是一个包装。 –