我在C#中有一个课,例如
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;
}
源自PSObject。 我正在使用import-module在powershell中加载具有此代码的DLL。 然后我尝试在PowerShell中创建一个MyComputer类的新对象。
PS C:> $ MyCompObj = New-Object MyComputer
但它会抛出一个错误,说明确保加载了包含此类型的程序集。 注意:我能够成功调用DLL中的Cmdlet。
我不确定这是继续创建新对象的正确方法。 请更正我做这项工作。
答案 0 :(得分:18)
首先,确保使用
加载程序集[System.Reflection.Assembly]::LoadFrom("C:\path-to\my\assembly.dll")
接下来,使用完全限定的类名
$MyCompObj = New-Object My.Assembly.MyComputer
答案 1 :(得分:5)
您无需以PSObject
为基础。简单地宣布没有基础的课程。
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 *
稍后当您使用该对象时,PowerShell会自动将其包装到PsObject
实例中。
[3]: $a = New-Object MyComputer
[4]: $a -is [psobject]
True
答案 2 :(得分:4)
以下是它如何运作。
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"
答案 3 :(得分:1)
MyComputer类是否在命名空间中?如果是这样,您可能需要在New-Object命令中使用该类的名称空间限定名称。
此外,PowerShell不喜欢公共名称DeviceName和deviceName,它们仅在大小写上有所不同。您可能想要声明deviceName private。 (但为什么不使用自动属性?)
最后,stej是正确的。无需从PSObject派生MyComputer类。