Я пытаюсь использовать PowerShell для вызова кода F #, в котором используются акторы Akka.Net.Почему я получаю MissingMethodException при вызове кода F # из PowerShell?
F # коды прекрасно работают в модульном тестировании и при запуске из # интерпретатора F, но когда я называю тот же код из командлетов PowerShell, я получаю следующее исключение:
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 хотя был доступен, и я получаю:
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.
В моем опыте «MissingMethodException» всегда вызвано проблемами с версией. Ваш сеанс PowerShell, скорее всего, заканчивается загрузкой другой версии некоторой сборки, чем тот, из которого был скомпилирован ваш код. Лучше всего использовать fuslogvw для устранения неполадок с привязкой сборки. Https://msdn.microsoft.com/en-us/library/e74a18c4 –
fuslogvw оказался хорошим началом. Не исправить эту проблему, но позвольте мне хотя бы диагностировать ее. Оказывается, что Akka.FSharp и FsPickler построены для разных версий FSharp.Core. В обычных проектах вы можете использовать магию привязки переадресаций, чтобы замаскировать эти различия, но это не так просто в PowerShell. В конце я последовал совету @ user2470798 и
отказался отпереработанных вещей, поэтому я не называю Akka непосредственно из PowerShell. –