开发者

How to use New-Object of a class present in a C# DLL using PowerShell

开发者 https://www.devze.com 2023-01-15 11:44 出处:网络
I have a class in C# say for example public class MyComputer : PSObject { public string UserName { get { return userName; }

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 sa开发者_Python百科ying 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.


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


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


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"


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号