15
votes

I have a class in C# say for example

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;
}

which is derived from PSObject. I am loading the DLL having this code in powershell using import-module. Then I tried to create a new object of the MyComputer class in PowerShell.

PS C:> $MyCompObj = New-Object MyComputer

but it throws an error saying make sure assembly containing this type is loaded. Note: I am able to call Cmdlets successfully which is present in the DLL.

I am not sure is this the right way to go ahead on creating a new object. Please correct to me make this work.

4
For completeness, if this still isn't working check to see if you are creating a class within a class. In that case, you will need to use a PLUS sign as the separator instead of a PERIOD. Such as: class A { class B }. To create class B, use "New-Object A+B" instead of "New-Object A.B"Brain2000

4 Answers

23
votes

First, make sure the assembly is loaded using

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

Next, use the fully qualified class name

$MyCompObj = New-Object My.Assembly.MyComputer
5
votes

You don't need to have PSObject as base. Simply declare class without 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 *

Later when you will work with the object, PowerShell will automatically wrap it into PsObject instance.

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

Here is how it got working.

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"
1
votes

Is the MyComputer class in a namespace? If so, you probably need to use the namespace-qualifed name of the class in the New-Object command.

Also, PowerShell does not like the public names DeviceName and deviceName which differ only in case. You probably meant to declare deviceName private. (But why not use auto-properties?)

Finally, stej is correct. There is no need to derive the MyComputer class from PSObject.