如何使用PowerShell使用C#DLL中存在的类的新对象
例如,我有一门C#say课程如何使用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
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”