如何使用PowerShell使用C#DLL中存在的类的新对象

如何使用PowerShell使用C#DLL中存在的类的新对象,c#,powershell,C#,Powershell,例如,我有一门C#say课程 public class MyComputer : PSObject { public string UserName { get { return userName; } set { userName = value; } } private string userName; public string DeviceName { get { return device

例如,我有一门C#say课程

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派生的。 我正在使用导入模块在powershell中加载具有此代码的DLL。 然后我尝试在PowerShell中创建MyComputer类的新对象

PS C:>$MyCompObj=新对象MyComputer

但它会抛出一个错误,即确保加载了包含此类型的程序集。 注意:我能够成功调用DLL中存在的cmdlet

我不确定这是否是继续创建新对象的正确方法。
请更正,让我来完成此工作。

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

MyComputer类是否位于命名空间中?如果是这样,您可能需要在newobject命令中使用类的名称空间限定名称

此外,PowerShell不喜欢公开名称DeviceName和DeviceName,它们只是大小写不同。您可能打算将deviceName声明为私有。(但为什么不使用自动属性?)


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

下面是它的工作原理

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"

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

[System.Reflection.Assembly]::LoadFrom("C:\path-to\my\assembly.dll")
接下来,使用完全限定的类名

$MyCompObj = New-Object My.Assembly.MyComputer

谢谢你的回复。如果我直接在PowerShell中定义类,那么您所说的将起作用。但是该类位于C#DLL中,因此该技术失败。C#自动属性是您的朋友。:-)只需确保将语言参数设置为CSharpVersion3。运气不好。也尝试了命名空间。删除PSObject derivation.FYI后也尝试过:MyComputer是一个命名空间内的类。这个示例对我不适用。它仍然会收到错误,告诉我验证是否加载了包含此类型的程序集。我确实验证了程序集是否已加载。有什么想法吗?为了完整性,如果这仍然不起作用,请检查您是否正在类中创建一个类。在这种情况下,您需要使用加号作为分隔符,而不是句号。例如:A类{B类}。要创建类B,请使用“新对象A+B”而不是“新对象A.B”。您还可以使用添加类型-路径“c:\path To\my\assembly.dll”