2017-10-06 4 views
0

PowerShell cmdlet을 구현하는 DLL을 C# 프로젝트에 추가하고 클래스와 마찬가지로 함수를 호출 할 수 있습니까? 문제는 cmdlet에 적절한 호출 기능이 없다는 것입니다. 그것은 invoke과 다른 물건을 대신 가지고 있습니다.powershell cmdlet dll의 함수 사용

다른 방법으로는 System.Management.Automation 네임 스페이스를 사용하는 것으로 알고 있습니다. 하지만 7000 번 같은 기능을 연속적으로 실행하면 성능 오버 헤드가 발생할 수 있습니다.

정확하게 말하자면 MS Dynamics Nav에 대해 Remove-NAVApplicationObjectLanguage 같은 컴 파일 (commdlets)을 처리하여 처리 할 파일과 7000 개의 파일을 처리해야합니다. 도서관에 그것을 포장하고 내게 편리한 방식으로 추가 처리를하고 싶습니다.

+2

코드 7000 번 cmdlet에서의 인스턴스를 호출의 성능 오버 헤드는 명령 라인에서 그것 7000 번 호출 다를 않을거야. 질문에 대답하기 위해 : 직접적으로, 아니요, cmdlet 인터페이스는'protected' 메소드를 사용합니다.이 때문에 Cmdlet 클래스의 인스턴스를 생성 할 때'Invoke()'만 노출되는 것을 볼 수 있습니다. –

답변

1

Microsoft는 Dynamics NAV 내에서 Dynamics NAV PowerShell Cmdlet을 실행하는 방법에 대해 블로그 기사 Coffee Break: Use the PowerShell Runner Add-In을 제공했습니다.

C#에서 사용하려는 경우 매우 동일한 Microsoft.Dynamics.Nav.PowerShellRunner.dll을 사용할 수 있습니다. 서비스 계층 C : \ Program Files \ Microsoft Dynamics NAV \ 100 \ Service \ Add-ins \ PowerShellRunner의 Add-Ins 폴더에 있습니다.

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

좋은 것. 아직이 Nav의 버전을 사용하지 않기 때문에 이것을 인식하지 못했습니다. 그러나 이것은 System.Management.Automation을 사용하는 것과 별반 다르지 않습니다. 대부분의 경우는 단지 주위의 래퍼 일뿐입니다. –

관련 문제