2013-02-27 118 views
1

从我们的某个硬件供应商处理最近获得的dll(用于.NET sdk中的工作)。他们提供了所有的类,方法等体面的文档,但他们的所有例子都在C#中。我不熟悉C#,并且正在将所有内容翻译成PowerShell。我已经取得了一些进展,但遇到了困难,我正在寻求一些帮助。将第三方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'上的研究并没有给我任何我可以消化的东西。

回答

2

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

$objColor.GetType() 

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

+0

好的,够公平的。回想起来,我认为要求“转换”是夸大了需求。我真正需要的是能够与这个API进行交互,而无需掌握其他语言。是否可以包装PoSh代码中现有的C#代码?或者是花时间学习C#的唯一实用解决方案? – 2013-02-28 07:21:06

+0

如果您只需调用API,那么您可能可以通过PowerShell执行此操作。不要担心Dotfuscator,因为它应该只使用非公共类型和类型成员的名称。顺便说一句,你应该能够通过类型名称来更新对象,例如new-object'<完全限定类型名称here>'-arg <构造器数组arg-here>。 – 2013-02-28 18:14:08

+0

所以,“如果你只需要调用API,那么你可能会从PowerShell做到这一点”,呃?你能指点我一个资源吗?这个资源会给我用来做这些事情的原则吗?我知道每个API的构建都是不同的,但我想有些特定的“钩子”对于任何基于.NET的api都很常见。 – 2013-02-28 21:37:26