2016-10-06 9 views
12

Próbuję utworzyć podstawowy moduł PowerShell z binarnymi obiektami Cmdlet, ponieważ pisanie rzeczy w programie PowerShell nie jest tak wygodne, jak w języku C#.Czy mogę napisać cmdlet binarny PowerShell z .NET Core?

Po this przewodnika, wygląda na to mam:

  • dodać Microsoft.PowerShell.SDK do mojego znaku project.json
  • moja klasa cmdlet z wymaganych atrybutów
  • napisać plik manifestu, z RootModule, Skierowanie .dll
  • Umieść, że .dll w pobliżu manifestu
  • wstaw oba pod PSModulePath

ale gdy próbuję Import-Module, rdzeń PowerShell narzeka na brakujące wykonywania:

Import-Module : Could not load file or assembly 'System.Runtime, Version=4.1.0.0, 
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system 
cannot find the file specified. 
At line:1 char:1 

Czy robię coś źle, czy takie skomplikowane rzeczy nie są obsługiwane jeszcze tak dobrze?

+0

Czy możesz udostępnić swój project.json? – Ben

+0

Sprawdź, czy to pomaga! http://stackoverflow.com/q/38310518/5212566 http://stackoverflow.com/a/37639003/5212566 –

+0

Niestety, to nie jest aktualne na teraz – brutallord

Odpowiedz

0

Musisz użyć PowerShell Core, aby napisać CmdLet PowerShell w .NET Core.

Jest przewodnikiem tutaj, w tym poprawki do project.json: https://github.com/PowerShell/PowerShell/tree/master/docs/cmdlet-example

Podsumowując potrzebne są następujące elementy w project.json

"dependencies": { 
     "Microsoft.PowerShell.5.ReferenceAssemblies": "1.0.0-*" 
    }, 

    "frameworks": { 
     "netstandard1.3": { 
      "imports": [ "net40" ], 
      "dependencies": { 
       "Microsoft.NETCore": "5.0.1-*", 
       "Microsoft.NETCore.Portable.Compatibility": "1.0.1-*" 
      } 
     } 
    } 
4

ten staje się dużo łatwiejsze z .NET Core 2.0 SDK i Visual Studio 2017 Update 15.3 (lub wyższy). Jeśli nie masz VS, możesz to zrobić z wiersza poleceń z .NET Core 2.0 SDK.

Ważnym elementem jest dodanie do pakietu projektu pakietu PowerShellStandard.Library 3.0.0-preview-01 (lub nowszego) NuGet (.csproj).

Oto prosty przykład linia poleceń:

cd $home 
dotnet new classlib --name psmodule 
cd .\psmodule 
dotnet add package PowerShellStandard.Library --version 3.0.0-preview-01 
Remove-Item .\Class1.cs 
@' 
using System.Management.Automation; 

namespace PSCmdletExample 
{ 
    [Cmdlet("Get", "Foo")] 
    public class GetFooCommand : PSCmdlet 
    { 
     [Parameter] 
     public string Name { get; set; } = string.Empty; 

     protected override void EndProcessing() 
     { 
      this.WriteObject("Foo is " + this.Name); 
      base.EndProcessing(); 
     } 
    } 
} 
'@ | Out-File GetFooCommand.cs -Encoding UTF8 

dotnet build 
cd .\bin\Debug\netstandard2.0\ 
ipmo .\psmodule.dll 
get-foo 

Aby uzyskać tę samą komendę, aby uruchomić w systemie Windows PowerShell 5.1 wymaga nieco więcej pracy. Musisz wykonać następujące czynności, zanim polecenie zadziała:

Add-Type -Path "C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\netstandard.dll" 
+0

Część Add-Type pomogła mi ładować bibliotekę .NET Standard do PowerShell, dzięki dużo! –

Powiązane problemy