【问题标题】:Translate 3rd-party C# to PowerShell将第 3 方 C# 转换为 PowerShell
【发布时间】:2013-02-13 23:37:39
【问题描述】:

使用最近从我们的一个硬件供应商处获得的 dll(用于在 .NET sdk 中工作)。他们为所有的类、方法等提供了不错的文档。但他们所有的示例都是用 C# 编写的。我不精通 C#,正在努力将所有内容都转换为 PowerShell。我取得了一些进展,但遇到了困难,正在寻求帮助。

这是他们在 C# 中的示例:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Vendor.Components.Flashlight.Sdk.Examples
    {
        class MyApp
        {
            public void Execute()
            {
                var device = new FlashlightController();
                device.Light(FlashlightColor.Green);
            }
        }
    }

到目前为止,这是我在 PowerShell 中的位置(如果有更雄辩的方式,请随时告诉我):

    ## Vendor DLL path
    $assemblyFlashlight = 'C:\FlashlightDLL\Flashlight.Sdk.dll'
    ## Adding new assembly as a Type and listing members
    $typeFlashLight = Add-Type -Path $assemblyFlashlight -PassThru
    $typeFlashlight

    IsPublic IsSerial Name                                     BaseType
    -------- -------- ----                                     --------
    True     False    DotfuscatorAttribute                     System.Attribute
    True     False    BusylightController                      System.Object
    True     True     BusylightSoundClip                       System.Enum
    True     True     BusylightVolume                          System.Enum
    True     False    BusylightColor                           System.Object
    False    False    b                                        System.Object
    False    False    c                                        System.Object
    False    False    e                                        System.Object
    False    False    f                                        System.Object
    False    False    d                                        System.Object
    False    False    i                                        System.ValueType
    False    False    a                                        System.ValueType
    False    False    g                                        System.Object
    False    False    h                                        System.ValueType
    False    True     d                                        System.MulticastDelegate
    False    False    b                                        System.ValueType
    False    False    e                                        System.Object
    False    False    c                                        System.Object
    False    False    f                                        System.Object
    False    False    a                                        d
    False    False    a                                        System.Object


    ## Creating objects
    $objController = New-Object $typeFlashLight[1]
    $objSoundClip = New-Object $typeFlashLight[2]
    $objVolume = New-Object $typeFlashLight[3]
    $objColor = New-Object $typeFlashLight[4]

上面的 PowerShell 代码运行没有错误,我的所有 $obj 变量都包含预期的成员:

    $objColor|Get-Member

    Name          MemberType Definition
    ----          ---------- ----------
    Equals        Method     bool Equals(System.Object obj)
    GetHashCode   Method     int GetHashCode()
    GetType       Method     type GetType()
    ToString      Method     string ToString()
    BlueRgbValue  Property   int BlueRgbValue {get;set;}
    GreenRgbValue Property   int GreenRgbValue {get;set;}
    RedRgbValue   Property   int RedRgbValue {get;set;}

所以我认为我在正确的轨道上。但我不知道如何翻译某些东西,例如“IsPublic”、“IsSerial”,而且我对“Dotfuscator”的研究并没有给我任何我能消化的东西。

【问题讨论】:

    标签: c# powershell translate


    【解决方案1】:

    IsPublic 和 IsSerial 不是您要实现的属性。它们是 System.RuntimeType 的属性,其中有一个与 .NET 中的每种类型相关联。试试这个:

    $objColor.GetType()
    

    至于将 C# 转换为 PowerShell,请记住,并不总是 100% 映射。也就是说,在 PowerShell 中,您不能创建类或接口,更不用说从其他类型派生的类型了。在 CLI 中,PowerShell 更像是一种消费者语言,而不是生产者语言。大多数情况下,这对于基本实用程序库来说都不是问题。但如果该库真的是一个框架,需要您从其基类或接口继承,您将无法使用 PowerShell。

    【讨论】:

    • 好的,很公平。回想起来,我认为要求“转换”是夸大了需求。我真正需要的是能够与这个 api 进行交互,而无需掌握另一种语言。可以将现有的 C# 代码包装在 PoSh 代码中吗?或者是花时间学习 C# 的唯一实用解决方案?
    • 如果您只需要调用 API,那么您可能可以从 PowerShell 中执行此操作。不要担心 Dotfuscator,因为它应该只使用非公共类型和类型成员的名称。顺便说一句,您应该能够按类型名称更新对象,例如new-object '' -arg .
    • 所以,“如果您只需要调用 API,那么您可能可以从 PowerShell 中执行此操作”,是吗?你能给我指出一个资源,它会给我一个人用来做这件事的原则吗?我知道每个 API 的构建方式都不同,但我想对于任何基于 .NET 的 api 来说,都有某些常见的“钩子”?
    • 看看这篇博文:mybsinfo.blogspot.com/2007/01/… 此外,Windows PowerShell in Depth 2nd Edition 的第 17 章涵盖了这个主题 - amazon.com/Windows-PowerShell-Action-Second-Edition/dp/…
    猜你喜欢
    • 2016-06-08
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多