我正在尝试使用PowerShell调用一些使用Akka.Net actor的F#代码。
F#代码在单元测试和从F#解释器运行时工作正常,但是当我从PowerShell cmdlet调用相同的代码时,我得到以下异常:
System.MissingMethodException: Method not found: 'Void Nessos.FsPickler.BinarySerializer..ctor(Microsoft.FSharp.Core.FSharpOption`1<Boolean>,
Microsoft.FSharp.Core.FSharpOption`1<Nessos.FsPickler.ITypeNameConverter>)'.
at Akka.FSharp.Serialization.ExprSerializer..ctor(ExtendedActorSystem system)
at Akka.FSharp.Serialization.exprSerializationSupport(ActorSystem system)
at Namespace.NewActorCmdlet..ctor(Host hostA, Host hostB, Boolean option, UserDetails user) in
E:\Projects\Namespace\NewActorCommand.fs:line 24
at Namespace.StartNewActorCommand.ProcessRecord() in
E:\Projects\Namespace\StartNewActor.fs:line 67
at System.Management.Automation.CommandProcessor.ProcessRecord()
我尝试在PowerShell会话中运行[Nessos.FsPickler.BinarySerializer]::new.OverloadDefinitions
来检查PS有哪些方法可用,我得到了:
Nessos.FsPickler.BinarySerializer new(Microsoft.FSharp.Core.FSharpOption[bool] forceLittleEndian, Microsoft.FSharp.Core.FSharpOption[Nessos.FsPickler.ITypeNameConverter] typeConverter)
我注意到的第一件事是PowerShell显示的版本采用FSharpOption [bool]而不是FSharpOption [Boolean]。我尝试修改Akka.FSharp代码以explcitly传递一个Option,但这似乎没有帮助。
我正在使用FSharp.Core 4.0.0.1(其他链接建议3.0有问题)。
有没有人见过类似的东西?
即使是关于在哪里查找问题的建议也会有所帮助,我不确定问题是与PowerShell,F#还是Akka.Net有关。
答案 0 :(得分:2)
在基于参数类型的匹配方法方面,Powershell可能很难。我发现有时我必须通过将表达式传递给方法而不是PS变量来“欺骗”PS。例如,$object.method($something.property)
代替$prop = $something.property; $object.method($prop)
对我有效。
在重载方法的情况下,您可以做的另一件事是使用Reflection来确保您拥有具有正确签名的方法。例如:
$mi=$object.gettype().getmethod('TheMethod',@([typeParm1],[typeParm2]))
$mi.invoke($object, @($arg1,$arg2))
有时施法有助于:$object.method([typeToMatchMethodSig]$arg1)
或者甚至可能是双重演员:$object.method([bool][int]$arg1)
在这两种情况下,如果你将演员表达式作为参数传递,我认为你会有更多的运气,而不是分配它变量并传递变量。
我怀疑OP中是这种情况,但使用[activator] :: createinstance(...)可以与私有构造函数一起使用。
我经常捣乱它,直到任何事情起作用或我放弃。
顺便说一句,你可以打开参数绑定的PS跟踪并获取大量信息,这些信息可能有用也可能没用。