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

时间:2010-09-08 09:31:58

标签: c# powershell

我在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。

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

4 个答案:

答案 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类。