gpt4 book ai didi

powershell - 为什么从 PowerShell 调用 F# 代码时会出现 MissingMethodException?

转载 作者:行者123 更新时间:2023-12-02 23:43:25 24 4
gpt4 key购买 nike

我正在尝试使用 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()

我尝试运行 [Nessos.FsPickler.BinarySerializer]::new.OverloadDefinitions在那个 PowerShell session 中检查 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 代码以明确传递一个选项,但这似乎没有帮助。

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

有没有人见过类似的东西?

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

最佳答案

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

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

$mi=$object.gettype().getmethod('TheMethod',@([typeParm1],[typeParm2]))
$mi.invoke($object, @($arg1,$arg2))

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

我怀疑在 OP 中是这种情况,但是使用 [activator]::createinstance(...) 可以与私有(private)构造函数一起使用。

我通常会搞砸它,直到有什么东西起作用或者我放弃了。

顺便说一句,您可以打开 PS 跟踪以进行参数绑定(bind)并获取大量信息,这些信息可能有用也可能没有用。

关于powershell - 为什么从 PowerShell 调用 F# 代码时会出现 MissingMethodException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33696325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com