How to use New-Object of a class present in a C# DLL using PowerShell
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.
精彩评论