如何使用PowerShell使用C#DLL中存在的类的New-Object

例如,我在C#中有一个class级

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。

我不确定这是继续创建新对象的正确方法。 请更正我做这项工作。

首先,确保使用加载程序集

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

接下来,使用完全限定的类名

 $MyCompObj = New-Object My.Assembly.MyComputer 

您不需要将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 

这是它如何运作。

 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" 

MyComputer类是否在命名空间中? 如果是这样,您可能需要在New-Object命令中使用该类的名称空间限定名称。

此外,PowerShell不喜欢公共名称DeviceName和deviceName,它们仅在大小写上有所不同。 您可能想要声明deviceName private。 (但为什么不使用自动属性?)

最后,stej是正确的。 无需从PSObject派生MyComputer类。