Совместимость.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, у вас есть два варианта, о которых я могу подумать:
- Возьмите исходный код Math.NET, измените его на целевой 4.3.0.0 и скомпилируйте его.
- Установите F# 3.1 в VS 2012
Но вы должны подумать об обновлении.