Как создать библиотеку классов с интерфейсом (ами) и / или методами, используемыми в Windows и / или PowerShell? - PullRequest
0 голосов
/ 22 февраля 2019

Мне нужно создать библиотеку классов на C #, которую я хотел бы включить в модуль PowerShell, который я пишу.Я бы хотел использовать библиотеку DLL в PowerShell, вызывая метод, аналогичный следующему:

Add-Type -Path $($variableHash.RootPath + "\Deviceparserstandalone.dll")    
[SkypeHelpers.CQTools.DeviceParser+Audio]::IsCertified($_.Caption)

Выше приведен пример импорта DLL-библиотеки PowerShell с последующим использованием метода IsCertified (яЯ предполагаю, что это метод).

Вот что я ищу:

  1. Есть ли что-то особенное, что мне нужно сделать, кроме создания нового проекта Visual Studio сШаблон библиотеки классов .NET Core, импортируйте зависимости, которые мне нужны для моей библиотеки, затем скомпилируйте код в DLL?
  2. Как предоставить некоторые методы, которые будут использоваться приложением-потребителем (в данном случае PowerShell), покадержать другие методы «в секрете»?Будет ли это похоже на использование интерфейса для описания методов, доступных для потребляющего приложения?Если да, то похоже ли это на создание интерфейса для веб-сайта ASP.NET Core 2.x?

Цель состоит в том, чтобы написать библиотеку классов, которую PowerShell может использовать для создания всплывающего уведомления для Windows 10Я понимаю, что для этого в галерее PowerShell есть открытые модули, но я пытаюсь понять, как она создается с нуля.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Другой альтернативой является создание полноценного модуля PowerShell.Вот быстрый способ сделать это:

  1. Создать новое решение для библиотеки классов
  2. NuGet в Microsoft.PowerShell.5.ReferenceAssemblies
  3. Создать простой класс POCO (просто как демонстрационный пример)) нравится:

Мой класс приветствия:

public class GreetingClass
{
    public string Greeting { get; set; }
    public string ToWhom { get; set; }
}
Затем создайте класс Cmdlet, который наследуется от System.Management.Automation.Cmdlet и поставляется с несколькими атрибутами PowerShell:

Вот мой:

[Cmdlet(VerbsCommon.New, "Greeting")]
[OutputType(typeof(GreetingClass))]
public class NewGreeting : Cmdlet
{
    [Parameter(Mandatory = true)]
    public string Greeting { get; set; }

    [Parameter]
    [Alias("Who")]
    public string ToWhom { get; set; } = "World";

    protected override void ProcessRecord()
    {
        base.ProcessRecord();

        WriteVerbose("Creating and returning the Greeting Object");
        var greeting = new GreetingClass {Greeting = Greeting, ToWhom = ToWhom};
        WriteObject(greeting);
    }
}
Чтобы его отладить, откройте вкладку Debug свойства проекта и установите:
  • Запустить внешнюю программу: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • Аргументы командной строки: -noprofile -noexit -command "import-module .\yourProjectName.dll

Теперь нажмите F5.Появится консоль PowerShell.Поскольку вы импортировали свой модуль, командлет New-Greeting загружен.Так что все это работает:

PS C:\> New-Greeting -Greeting "hello there" -ToWhom World

, что приводит к:

Greeting    ToWhom
--------    ------
hello there World

Но ваш командлет является полноценным командлетом PowerShell, поэтому он может попасть в конвейер.Это:

PS C:\> New-Greeting -Greeting "What's new" -ToWhom Pussycat | Format-List

В результате:

Greeting : What's new
ToWhom   : Pussycat

Поскольку вы запускаете сеанс PowerShell, когда нажимаете F5 и загружаете свой модуль, вы можете установить точки останова в своем коде,пошаговый и т. д. в отладчике.

Вы получаете все обычные преимущества PowerShell.Вы можете использовать -Who в качестве псевдонима для -ToWhom.Параметр -Greeting описывается как обязательный, поэтому, если вы забудете его, консоль предложит вам.

Вы также можете предоставить методы для вашего класса POCO.Например, если вы добавите этот метод к GreetingClass:

public void SayHello()
{
    Console.WriteLine($"{Greeting} {ToWhom}");
}

Вы можете сделать это в PowerShell:

PS C:\> $greet = New-Greeting -Greeting Hello -Who World
PS C:\> $greet.SayHello()

и получить в результате:

Hello World

Я многому научился из этого: https://www.red -gate.com / simple-talk / dotnet / net-development / using-c-to-create-powershell-cmdlets-the-basics /

Вы автоматически получаете базовую Get-Help помощь из PowerShell, но если вы будете следовать демонстрациям Red-Gate (по ссылке выше), вы узнаете, как получить помощь Get-Helpиз стандартного C # XML Comments (из пакета XmlDoc2CmdletDoc NuGet).

0 голосов
/ 22 февраля 2019

Ничего особенного.Попробуйте создать новую библиотеку классов с именем "Animal" и добавьте следующий код:

namespace Animal
{
    public class Dog
    {
        public string Bark()
        {
            return "Woof!";
        }
    }
}

Создайте проект (для создания .dll).Вы можете найти .dll в <projectLocation>\bin\<Release|Debug>.

Теперь откройте PowerShell и введите этот код:

Add-Type -Path "C:\...\Projects\Animal\Animal\bin\Debug\Animal.dll"
$dog = [Animal.Dog]::new()
$dog.Bark()

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...