PowerShell和Google Protocol Buffer技术

时间:2012-11-16 20:57:09

标签: c# powershell protobuf-net

我需要使用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方法来解决问题?

2 个答案:

答案 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