Как использовать новый объект класса, присутствующего в С# DLL, используя PowerShell

У меня есть класс в С#, например,

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. Я загружаю DLL с этим кодом в powershell с помощью import-module. Затем я попытался создать новый объект класса MyComputer в PowerShell.

PS C: > $MyCompObj = New-Object MyComputer

но он выдает сообщение об ошибке: убедитесь, что загружена сборка, содержащая этот тип. Примечание. Я могу успешно вызвать командлеты, которые присутствуют в DLL.

Я не уверен, что это правильный путь для создания нового объекта. Пожалуйста, исправьте меня, сделайте эту работу.

Ответ 1

Сначала убедитесь, что сборка загружена с помощью

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

Далее, используйте полное имя класса

$MyCompObj = New-Object My.Assembly.MyComputer

Ответ 2

Вам не нужно иметь 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

Ответ 3

Вот как он работал.

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"

Ответ 4

Является ли класс MyComputer в пространстве имен? Если это так, вам, вероятно, необходимо использовать имя класса, присвоенное именам класса, в команде "Новый объект".

Кроме того, PowerShell не любит публичные имена DeviceName и deviceName, которые отличаются только в случае. Вероятно, вы решили объявить имя устройства private. (Но почему бы не использовать авто-свойства?)

Наконец, stej верен. Нет необходимости выводить класс MyComputer из PSObject.