2010-09-08 12 views
10

Ho una classe in C# dicono per esempioCome utilizzare New-oggetto di una classe presente in una DLL C# utilizzando 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; 
} 

che è derivato da PSObject. Sto caricando la DLL con questo codice in PowerShell usando import-module. Quindi ho provato a creare un nuovo oggetto della classe MyComputer in PowerShell.

PS C:> $ MyCompObj = New-Object MyComputer

ma genera un errore dicendo assicurarsi assembly contenente questo tipo viene caricato. Nota: Sono in grado di chiamare Cmdlet correttamente che è presente nella DLL.

Non sono sicuro che sia il modo giusto per procedere alla creazione di un nuovo oggetto. Si prega di correggere per me fare questo lavoro.

risposta

5

Non è necessario disporre di PSObject come base. Dichiara semplicemente una lezione senza base.

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 * 

Più tardi, quando si lavorerà con l'oggetto, PowerShell andrà a capo automaticamente in PsObject esempio.

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

Grazie per la risposta. Se sto definendo la classe direttamente in PowerShell, allora quello che hai detto funzionerà. Ma la classe è all'interno della DLL C#, quindi questa tecnica fallisce. – Shaj

+1

Le proprietà C# sono tuoi amici. :-) Assicurati di impostare il parametro Language su CSharpVersion3. –

+0

@ Keith, giusto. Ho appena editato l'esempio di Shaj :) – stej

1

La classe MyComputer è in uno spazio dei nomi? In tal caso, è probabilmente necessario utilizzare il nome qualificata della classe nel comando New-Object.

Inoltre, PowerShell non ama i nomi pubblici DeviceName e deviceName che differiscono solo nel caso. Probabilmente hai intenzione di dichiarare deviceName private. (Ma perché non utilizzare auto-proprietà?)

Infine, Stej è corretto. Non è necessario derivare la classe MyComputer da PSObject.

+0

Nessuna fortuna. Ho provato anche con lo spazio dei nomi. Provato anche dopo aver rimosso la derivazione PSObject. – Shaj

+0

FYI: MyComputer è una classe all'interno di uno spazio dei nomi. – Shaj

4

Ecco come sia arrivato a lavorare.

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

Questo esempio non funziona per me. Riceve ancora gli errori che mi dicono di verificare che l'assembly che contiene questo tipo sia caricato. Ho verificato che l'assembly sia stato caricato. Qualche idea? – James

15

In primo luogo, assicurarsi che l'assembly viene caricato utilizzando

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

Quindi, utilizzare il nome completo della classe

$MyCompObj = New-Object My.Assembly.MyComputer 
Problemi correlati