2010-09-08 10 views
10

tengo una clase en C# dicen por ejemploCómo utilizar New-Object de una clase presente en una DLL de C# utilizando 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; 
} 

que se deriva de PSObject. Estoy cargando la DLL que tiene este código en powershell usando import-module. Luego traté de crear un nuevo objeto de la clase MyComputer en PowerShell.

PS C:> = $ MyCompObj MiEquipo New-Object

pero lanza un error diciendo que asegúrese de ensamblaje que contiene este tipo se carga. Nota: puedo invocar con éxito los cmdlets que están presentes en la DLL.

No estoy seguro de que este sea el camino correcto para seguir creando un nuevo objeto. Corrígeme para que esto funcione.

Respuesta

5

No necesita tener PSObject como base. Simplemente declare la clase sin 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 * 

Más tarde, cuando va a trabajar con el objeto, PowerShell se ajustará automáticamente en PsObject ejemplo.

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

Gracias por su respuesta. Si estoy definiendo la clase directamente en PowerShell, entonces lo que dijiste funcionará. Pero la clase está dentro de la DLL de C#, por lo que esta técnica falla. – Shaj

+1

Las propiedades automáticas de C# son su amigo. :-) Solo asegúrese de establecer el parámetro de Idioma en CSharpVersion3. –

+0

@ Keith, a la derecha. Acabo de editar el ejemplo de Shaj :) – stej

1

¿La clase MyComputer está en un espacio de nombres? Si es así, probablemente necesite usar el nombre calificado por espacio de nombres de la clase en el comando New-Object.

Además, a PowerShell no le gustan los nombres públicos DeviceName y deviceName, que difieren solo en el caso. Probablemente quisiste declarar deviceName private. (¿Pero por qué no usar auto-propiedades?)

Finalmente, stej es correcto. No es necesario derivar la clase MyComputer de PSObject.

+0

Sin suerte. Intenté con el espacio de nombres también. También se intentó después de eliminar la derivación de PSObject. – Shaj

+0

FYI: MyComputer es una clase dentro de un espacio de nombres. – Shaj

4

Así es como funcionó.

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

Este ejemplo no funciona para mí. Todavía recibe los errores que me indican que verifique que el ensamblaje que contiene este tipo está cargado. Verifiqué que el ensamblaje está cargado. ¿Algunas ideas? – James

15

En primer lugar, asegúrese de que el ensamblado se carga utilizando

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

A continuación, utilice el nombre completo de la clase

$MyCompObj = New-Object My.Assembly.MyComputer 
Cuestiones relacionadas