FsUnit: из-за этого невозможно протестировать переносимую библиотеку и протестировать проект с разными версиями F # .Core

У меня есть портативная библиотека, для которой FSharp.Core версия - 3.7.4.0. При установке (в проекте Unit Test) FsUnit устанавливается, как зависимость, FSharp.Core версия 3.1.2.5.

В связи с этим использование функций переносимой библиотеки в моем проекте Unit Test, например:

module StammaTests.PieceTests

open Stamma
open NUnit.Framework
open FsUnitTyped

[<Test>]
let ``Testing a Basic function`` () =
    Piece.toChar Black King |> shouldEqual 'k'

дает ошибку:

Сообщение о результате: System.IO.FileLoadException: не удалось загрузить файл или сборку FSharp.Core, Version = 3.7.4.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a или одну из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Пробовал обновить версию FSharp.Core с NuGet до 4.0.0.1 (даже проверяя оба проекта при обновлении), а теперь даже что-то простое, например:

[<Test>]
let ``Testing the test`` () = 1 |> shouldEqual 1 

не работает, что дает аналогичную ошибку.

Сообщение о результате: System.IO.FileLoadException: не удалось загрузить файл или сборку FSharp.Core, Version = 4.3.1.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a или одну из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

И ошибка первого неудачного теста не меняется.

Мне кажется, что мне не хватает чего-то до боли очевидного, и я нашел несколько человек с похожими проблемами, но я не понимаю, что они сделали, чтобы решить эту проблему (похоже, все они ее решили ..) Например, этот.

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

Оба проекта являются библиотеками, и у меня нет app.config файла, в который можно что-либо добавить.


person asibahi    schedule 21.09.2016    source источник


Ответы (2)


Добавьте перенаправление привязки в свой app.config файл, чтобы перенаправить все FSharp.Core привязки на желаемую версию. Например, при использовании версии 4.4.0 ваш app.config файл будет выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
person mpeac    schedule 21.09.2016
comment
В какой проект мне это добавить? - person asibahi; 21.09.2016
comment
Чтобы было ясно, оба проекта являются библиотеками, и у меня нет app.config файла. Я читал этот ответ в другом месте, но поскольку у меня нет файла, я не понимаю, как его использовать. - person asibahi; 21.09.2016
comment
Просто добавьте новый файл app.config в свой проект библиотеки. - person mpeac; 21.09.2016
comment
Не удалось заставить это работать. Ставлю <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="3.1.2.5" /> в свою библиотеку, пересобираю, и та же ошибка. Разные версии в новых версиях тоже не решали. - person asibahi; 21.09.2016
comment
Ну, вы ничего не сказали о сбое привязки для nunit.framework - person mpeac; 22.09.2016
comment
Я поделился тем, что знал. - person asibahi; 22.09.2016

Я нашел решение, которое действительно работало здесь

По сути, добавление App.config в тестовый проект и написание следующего:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.4.14350" newVersion="2.6.4.14350" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Он добавляет привязку к обоим Fsharp.Core и NUnit.Framework, в отличие от обычных решений, где вы добавляете привязку только для Fsharp.Core.

person asibahi    schedule 21.09.2016
comment
Таким образом, подразумевается, что FSharp.Core ссылается на nunit.framework. Так ли это? Я спрашиваю, потому что это кажется странным. - person Charlie; 21.09.2016
comment
Я не думаю, что это так. Я поместил сюда только то, что у меня сработало. - person asibahi; 21.09.2016