2013-02-27 112 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