如何使用Windows和/或PowerShell使用的接口和/或方法创建类库?

k2fxgqgv  于 2023-01-26  发布在  Shell
关注(0)|答案(2)|浏览(119)

我需要用C#创建一个类库,我想把它包含在我正在编写的PowerShell模块中。我想通过调用一个方法来使用PowerShell中的DLL,就像你会做的那样,如下所示:

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

以上是PowerShell导入DLL,然后使用IsCertified方法(我假设它是一个方法)的示例。
这是我正在寻找的:
1.除了使用.NET核心类库模板创建一个新的Visual Studio项目、导入库所需的依赖项、然后将代码编译为DLL之外,我还需要做什么特殊的事情吗?
1.如何公开一些方法供消费应用程序使用(在本例中为PowerShell),同时保持其他方法“私有”?这是否类似于使用接口来描述消费应用程序可用的方法?如果是,这是否类似于为ASP.NET Core 2.x网站创建接口?
我们的目标是编写一个类库,PowerShell可以使用它为Windows 10创建一个吐司通知。我知道PowerShell库中有一些公共模块,但我试图了解它是如何从头开始构建的。

4zcjmb1e

4zcjmb1e1#

***主要更新:**适用于Powershell v7和. NET Core-请参阅下文 *

另一种选择是制作一个完整的PowerShell模块,下面是一个快速的方法:
1.创建新的类库解决方案

  1. nuGet在Microsoft.PowerShell.5.ReferenceAssemblies
    • 注:**

Microsoft.PowerShell.5.ReferenceAssemblies NuGet程序包仅与. NET Framework(v4.8之前)兼容,而与. NET核心不兼容。此问题可以通过针对.NET Standard进行更正(请参阅下面的"主要更新")
1.创建一个简单的POCO类(仅作为演示),如下所示:
我的问候语类:

public class GreetingClass
{
    public string Greeting { get; set; }
    public string ToWhom { get; set; }
}

1.然后创建一个继承自System.Management.Automation.Cmdlet的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);
    }
}

1.为了调试它,打开Debug选项卡项目属性并设置:

  • 启动外部程序:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • 命令行参数:-noprofile -noexit -command "import-module .\yourProjectName.dll

现在按F5。PowerShell控制台将出现。由于您导入了模块,因此New-Greeting cmdlet已加载。因此,这一切都将正常工作:

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

导致:

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

但是,您的cmdlet是一个完整的PowerShell cmdlet,因此它可以进入管道。

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

将导致:

Greeting : What's new
ToWhom   : Pussycat

由于您在按F5并加载模块时启动PowerShell会话,因此您可以在调试器内的代码、单步等中设置断点。
您可以获得所有正常的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/
您可以从PowerShell自动获得基本的Get-Help帮助,但是如果您跟随Red-Gate演示(从上面的链接),您将了解如何从标准C#XML注解(从XmlDoc2CmdletDoc NuGet包)获得丰富的Get-Help帮助。
在XmlDoc2CmdletDoc的GitHub自述文件页面上简要描述了XmlDoc2CmdletDoc的XML注解获取帮助功能:https://github.com/red-gate/XmlDoc2CmdletDoc

    • 主要更新**

我使用了. NET标准程序集(即. NET核心兼容)和新的基于核心的PowerShell(PowerShell v7),在大多数情况下,上面的一切仍然有效。

  • 使用Visual Studio 2022
  • 创建 * 类库-C#*(不是. NET Framework)项目
  • 将 * 目标框架 * 设置为.NET Standard 2.0
  • nuGet在Microsoft.PowerShell.5.1.ReferenceAssemblies

让它调试起来更加困难(因为. NET核心应用程序的古怪的新调试设置):

  • 在"解决方案资源管理器"中右键单击该项目,然后选择"* 属性 *"
  • 在 * 调试 * 选项卡上,选择 * 打开调试启动配置文件UI * 链接
  • 在弹出的 * 启动配置文件 * 窗口中:
  • 单击 * 创建新配置文件 * 图标(窗口左上角的图标)
  • 将其选择为 * 可执行 *
  • 将可执行文件名称设置为C:\Program Files\PowerShell\7\pwsh.exe(或安装了PowerShell 7的位置)
  • 使用与上述相同的 * 命令行参数 *(-noprofile -noexit -command "import-module .\yourProjectName.dll
  • 设置好后,重命名配置文件(最右边的图标),使其与已经存在的默认配置文件完全相同。

相同的. NET标准程序集现在可以同时用于传统的 * Windows PowerShell * 和新的PowerShell 7(我使用的是7.2.8版)。
如果我在这些说明中搞砸了什么,请在评论中让我知道。

0md85ypi

0md85ypi2#

没有什么特别要做的。尝试创建一个名为"Animal"的新类库并添加以下代码:

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

构建项目(以创建. dll)。您可以在<projectLocation>\bin\<Release|Debug>下找到. dll。
现在打开powershell并输入以下代码:

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

相关问题