我需要使用PowerShell来使用Google协议缓冲区。尚未找到特定于语言的转换器,并且使用protobuf-net(C#)生成.cs代码,后来生成.dll文件。
所有找到的方法都涉及New-Object构造,但公共静态类Serializer在protobuf-net.dll中定义,因此无法创建对象(类实例) - > New-Object:找不到构造函数。无法为ProtoBuf.Serializer类型找到合适的构造函数。
$memory_stream = New-Object System.IO.MemoryStream
#######
$obj = new-object ControlInterface.EnableGate
$obj.GateId = 2
$obj.Day = 7
#######
$method = [ProtoBuf.Serializer]
$Serialize = $method.GetMethods() | Where-Object {
$_.Name -eq "Serialize" -and
$_.MetadataToken -eq "110665038"
}
$massive = @($memory_stream,$obj)
$closedMethod = $Serialize.MakeGenericMethod([ControlInterface.EnableGate])
$closedMethod.Invoke($method,$massive)
目前的错误如下: 使用“2”参数调用“Invoke”的异常:“类型为'System.Management.Automation.PSObject'的对象'无法转换为'System.IO.Stream'类型。”
是否可以避免使用C#附加代码,仅使用PowerShell方法来解决问题?
答案 0 :(得分:1)
这是由于PowerShell将新创建的对象转换为动态PSObject类型,而不是实际的.NET类型。
你要做的就是将一个强制转换应用于对象变量声明,你的困境就会消失。 (花了我很多年才发现)
修复你的例子:
[IO.MemoryStream] $memory_stream = New-Object IO.MemoryStream
#######
[ControlInterface.EnableGate] $obj = new-object ControlInterface.EnableGate
$obj.GateId = 2
$obj.Day = 7
#######
$method = [ProtoBuf.Serializer]
$Serialize = $method.GetMethods() | Where-Object {
$_.Name -eq "Serialize" -and
$_.MetadataToken -eq "110665038"
}
$massive = @($memory_stream,$obj)
$closedMethod = $Serialize.MakeGenericMethod([ControlInterface.EnableGate])
$closedMethod.Invoke($method,$massive)
答案 1 :(得分:0)
我不知道你想要问的是什么,但是有些人在PowerShell中使用::
调用静态方法。
例如:
[System.IO.Path]::GetFileName("C:\somefile.jpg")
但是无论如何你想在C#中做到这一点,你可以这样做:
$source = @"
public class SampleClass
{
public static int Add(int a, int b)
{
return (a + b);
}
public int Multiply(int a, int b)
{
return (a * b);
}
}
"@
Add-Type $source
$obj = New-Object SampleClass