Ответ 1
Сначала убедитесь, что сборка загружена с помощью
[System.Reflection.Assembly]::LoadFrom("C:\path-to\my\assembly.dll")
Далее, используйте полное имя класса
$MyCompObj = New-Object My.Assembly.MyComputer
У меня есть класс в С#, например,
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.
Я не уверен, что это правильный путь для создания нового объекта. Пожалуйста, исправьте меня, сделайте эту работу.
Сначала убедитесь, что сборка загружена с помощью
[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 в пространстве имен? Если это так, вам, вероятно, необходимо использовать имя класса, присвоенное именам класса, в команде "Новый объект".
Кроме того, PowerShell не любит публичные имена DeviceName и deviceName, которые отличаются только в случае. Вероятно, вы решили объявить имя устройства private. (Но почему бы не использовать авто-свойства?)
Наконец, stej верен. Нет необходимости выводить класс MyComputer из PSObject.