首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在从MissingMethodException调用F#代码时得到一个PowerShell?

为什么我在从MissingMethodException调用F#代码时得到一个PowerShell?
EN

Stack Overflow用户
提问于 2015-11-13 15:35:51
回答 1查看 806关注 0票数 2

我试图使用PowerShell调用一些使用Akka.Net参与者的F#代码。

F#代码在单元测试和从F#解释器运行时运行良好,但是当我从PowerShell cmdlet调用相同的代码时,会得到以下异常:

代码语言:javascript
复制
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()

我尝试在那个[Nessos.FsPickler.BinarySerializer]::new.OverloadDefinitions会话中运行PowerShell,以检查PS是可用的哪些方法,我得到:

代码语言:javascript
复制
Nessos.FsPickler.BinarySerializer new(Microsoft.FSharp.Core.FSharpOption[bool] forceLittleEndian, Microsoft.FSharp.Core.FSharpOption[Nessos.FsPickler.ITypeNameConverter] typeConverter)

我注意到的第一件事是,PowerShell显示的版本采用的是FSharpOptionbool而不是FSharpOptionBoolean。我尝试修改Akka.FSharp代码以明确传递一个选项,但这似乎没有帮助。

我使用的是FSharp.Core 4.0.0.1 (其他链接建议3.0有问题)。

有人见过类似的东西吗?

即使是关于在哪里查找问题的建议也会有帮助,我不确定问题是PowerShell、F#还是Akka.Net。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-17 03:55:48

当涉及到基于参数类型的匹配方法时,Powershell可能是困难的。我发现,有时我不得不通过将表达式传递给方法而不是PS变量来“欺骗”PS。例如,$object.method($something.property)而不是$prop = $something.property; $object.method($prop)为我工作。

在重载方法的情况下,您可以做的另一件事是使用反射来确保获得了具有正确签名的方法。例如:

代码语言:javascript
复制
$mi=$object.gettype().getmethod('TheMethod',@([typeParm1],[typeParm2]))
$mi.invoke($object, @($arg1,$arg2))

有时,强制转换会有所帮助:$object.method([typeToMatchMethodSig]$arg1),甚至可能是双重强制转换:$object.method([bool][int]$arg1),在这两种情况下,我认为如果将强制转换表达式作为参数传递,而不是将其赋值给变量并传递变量,则会有更多的运气。

我对OP中的情况表示怀疑,但使用激活器::createinstance(.)可以与私有构造函数一起使用。

我经常胡闹,直到某件事奏效或者我放弃为止。

顺便说一句,您可以打开PS跟踪参数绑定,并获得许多信息,这可能是有用的,也可能没有用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33696325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档