Как использовать New-Object класса, присутствующего в C # DLL, используя PowerShell - PullRequest
13 голосов
/ 08 сентября 2010

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

PS C:> $ MyCompObj = New-Object MyComputer

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

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

Ответы [ 4 ]

19 голосов
/ 09 сентября 2010

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

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

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

$MyCompObj = New-Object My.Assembly.MyComputer
5 голосов
/ 08 сентября 2010

Вам не нужно иметь 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
4 голосов
/ 09 сентября 2010

Вот как это заработало.

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"
1 голос
/ 08 сентября 2010

Класс MyComputer находится в пространстве имен?Если это так, вам, вероятно, потребуется использовать имя класса, определенное в пространстве имен, в команде New-Object.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...