2010-09-08 215 views
10

存在於C#DLL I類在C#中的一類新物體,例如說如何使用使用PowerShell

public class MyComputer : PSObject 
{ 
    public string UserName 
    { 
     get { return userName; } 
     set { userName = value; } 
    } 
    private string userName; 

    public string DeviceName 
    { 
     get { return deviceName; } 
     set { deviceName = value; } 
    } 
    public string deviceName; 
} 

這是從PSObject的。 我正在使用導入模塊在PowerShell中加載具有此代碼的DLL。 然後我嘗試在PowerShell中創建一個MyComputer類的新對象。

PS C:> $ MyCompObj =新對象我的電腦

但它拋出一個錯誤說法使含有這種類型確保組件加載。 注意:我能夠成功調用DLL中存在的Cmdlet。

我不確定這是創建新對象的正確方法。 請對我做出這項工作。

回答

5

您不需要有PSObject作爲基礎。只需聲明無基礎的類。

Add-Type -typedef @" 
public class MyComputer 
{ 
    public string UserName 
    { 
     get { return _userName; } 
     set { _userName = value; } 
    } 
    string _userName; 

    public string DeviceName 
    { 
     get { return _deviceName; } 
     set { _deviceName = value; } 
    } 
    string _deviceName; 
} 
"@ 

New-Object MyComputer | fl * 

後來,當你將與對象的工作,PowerShell中會自動將它包裝成PsObject實例。

[3]: $a = New-Object MyComputer 
[4]: $a -is [psobject] 
True 
+0

感謝您的答覆。 如果我直接在PowerShell中定義類,那麼你所說的將會起作用。但是這個類在C#DLL中,所以這種技術失敗了。 – Shaj 2010-09-08 10:01:55

+1

C#自動屬性是你的朋友。 :-)請確保將Language參數設置爲CSharpVersion3。 – 2010-09-08 15:41:52

+0

@凱斯,對。我剛剛編輯了Shaj的例子:) – stej 2010-09-08 20:09:56

1

命名空間中的MyComputer類是什麼?如果是這樣,您可能需要在New-Object命令中使用該類的命名空間限定名稱。

此外,PowerShell不喜歡僅在大小寫不同的情況下公用名稱DeviceName和deviceName。你可能打算聲明deviceName是私人的。 (但爲什麼不使用自動屬性?)

最後,stej是正確的。沒有必要從PSObject派生MyComputer類。

+0

沒有運氣。也嘗試了命名空間。 也刪除PSObject派生後嘗試。 – Shaj 2010-09-08 16:47:06

+0

僅供參考:MyComputer是一個名稱空間內的類。 – Shaj 2010-09-08 16:48:28

4

這是它的工作原理。

public class MyComputer 
{ 
    public string UserName 
    { 
     get { return userName; } 
     set { userName = value; } 
    } 
    private string userName; 

    public string DeviceName 
    { 
     get { return deviceName; } 
     set { deviceName = value; } 
    } 

    public string deviceName; 
} 

//PS C:\> $object = New-Object Namespace.ClassName 
PS C:\> $object = New-Object Namespace.MyComputer 
PS C:\> $object.UserName = "Shaj" 
PS C:\> $object.DeviceName = "PowerShell" 
+0

這個例子對我不起作用。它仍然會得到錯誤,告訴我要驗證包含此類型的程序集是否已加載。我確實驗證了程序集已加載。有任何想法嗎? – James 2014-12-18 19:35:33

15

首先,確保組件使用

[System.Reflection.Assembly]::LoadFrom("C:\path-to\my\assembly.dll") 

接下來加載,使用完全合格的類名

​​