Совместимость.Net 4.0 и.Net 4.5. Не удалось загрузить файл или сборку 'FSharp.Core, версия =4.3.1.0.'

Я хочу использовать библиотеку Math.NET Symbolics в проекте F#. Но когда я запускаю простой код:

open MathNet.Symbolics
open MathNet.Symbolics.Operators

...

let expr = Infix.parseOrThrow("sin(x) * y")
let symbols = Map.ofList [ "x", Real 2.0; "y", Real 3.0 ]
let res = Evaluate.evaluate symbols expr

Я имею:

Could not load file or Assembly ' FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" or one of the dependent components. The system cannot find the file specified.

Я создал тему на форуме Math.NET

Во время обсуждения я подумал, что это невозможно, потому что у меня есть только.Net 4.5 и VS2012 (поэтому я не могу использовать F#3.1).

Но я не могу понять, если все работает в.Net 4.0, почему я не могу нормально использовать в.Net 4.5. А как насчет совместимости версии?

Вопрос: это вообще возможно? И, если возможно, как?

Редактировать:

Когда app.config имеет:

<bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />
<bindingRedirect oldVersion="2.3.5.0" newVersion="4.3.0.0" />
<bindingRedirect oldVersion="2.0.0.0" newVersion="4.3.0.0" />

Этот код работает нормально:

let symbols = Map.ofList [ "x", Real 2.0; "y", Real 3.0 ]
let x = symbol "x"
let y = symbol "y"
let res = Evaluate.evaluate symbols (sin(x) * y) 

Но мне нужно использовать синтаксический анализатор для математических выражений. Поэтому этот вариант меня не устраивает.

Обновить:

Ответ:

После неудачной компиляции Visual Studio была изменена ссылка на FSharp.Core из папки пакета на стандартном FSharp.Core 4.3.0.0. Когда я установил свойство "Copy Local" = "true" - проблема была решена.

Теперь код

let expr = Infix.parseOrThrow("sin(x) * y")
let symbols = Map.ofList [ "x", Real 2.0; "y", Real 3.0 ]
let res = Evaluate.evaluate symbols expr

дает еще одно исключение:

System.TypeInitializationException: The type initializer for '<StartupCode$MathNet-Symbolics>.$Infix'
 threw an exception. ---> System.Security.VerificationException: Operation could destabilize the runtime

Я искал ошибку там, где ее не было. Проблема не в зависимости. Потому что код без использования FParces работал!

На странице для пакета написано следующее:

"В этом пакете используется базовая конфигурация FParsec с низким уровнем доверия, которая не использует какой-либо непроверяемый код и оптимизирована для максимальной переносимости. Если вам нужно анализировать очень большие файлы или если вы используете FParsec для задач, критичных к производительности, рассмотрите возможность использования альтернативный пакет NuGet "Big Data Edition" (см. nuget.org/packages/fparsec-big-data-edition). "

Итак, я изменил FParsec на FParsec (Big Data Edition), и все работает!

PS Мои попытки изменить редирект связывания не имели смысла =) просто напишите:

<bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />

1 ответ

Если Math.NET был скомпилирован с 4.3.1.0, и вы застряли в Visual Studio 2012, которая поставляется с 4.3.0.0, у вас есть два варианта, о которых я могу подумать:

Но вы должны подумать об обновлении.

Другие вопросы по тегам