Не удается разрешить зависимость от сборки FSharp.Core 4.4.1.0 при использовании VS 2017
Я уже давно работаю в VS 2015 и F# 4.0 (4.4.0.0).
С выпуском VS 2017 я хочу открыть решения в новейшей VS для разработки, но пока еще сохраняю проекты под VS 2015, F# 4.0, .NET 4.5.2. Сервер сборки также должен будет некоторое время использовать VS 2015.
Насколько я помню, такого рода сценарий не был проблематичным при более ранних обновлениях версии VS, но тогда я не думаю, что использовал F# в то время.
Я открыл решение и попытался скомпилировать. Я получаю эту ошибку в проекте приложения C#. (Существуют другие приложения на C#, и по крайней мере одно ссылается на библиотеку F#.)
Неизвестная ошибка сборки, "Не удается разрешить зависимость от сборки" FSharp.Core, Версия =4.4.1.0, Culture= нейтральный, PublicKeyToken=b03f5f7f11d50a3a', поскольку он не был предварительно загружен. При использовании API ReflectionOnly зависимые сборки должны быть предварительно загружены или загружены по требованию через событие ReflectionOnlyAssemblyResolve.
Все мои F# проекты в решении 4.0 (4.4.0.0). Я дважды проверил.
Почему это происходит?
3 ответа
Я искал "4.4.1.0" и обнаружил, что папка "obj" проекта C# содержит файл.exe.config, который отличается от app.config. У него была эта дополнительная информация, которой нет в app.config проекта.
<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.1.0" newVersion="4.4.1.0" />
</dependentAssembly>
</assemblyBinding>
Почему это добавляется автоматически, и почему только в этом конкретном проекте C#?
Я попытался скопировать этот раздел в app.config проекта и изменить его на 4.4.0.0 в обоих местах, но это не сработало. Также пытался использовать "4.4.1.0" в качестве верхнего предела старой версии и иметь "4.4.0.0" в качестве новой версии, но все равно не работал. Та же ошибка компилятора.
Затем я удалил этот раздел и сослался на FSharp.Core 4.4.0.0 в проекте C#. Это, наконец, избавило от ошибки компиляции.
Я запустил программу. Это разбилось с этим исключением.
Необработанное исключение: не удалось загрузить файл или сборку 'FSharp.Core, версия =4.4.1.0, Culture= нейтральный, PublicKeyToken=b03f5f7f11d50a3a' или одну из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
Я заново вставил раздел с редиректом, и теперь программа работает нормально.
Чтобы подвести итог, я добавил ссылку на FSharp.Core 4.0, и перенаправление выглядит так
<bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.0.0" />
С этими модификациями решение все еще работает, как и ожидалось, в VS 2015.
У меня была такая же проблема, может быть, это кому-нибудь пригодится:
В моем случае причина была в том, что некоторые из моих проектов C# с транзитивными зависимостями на FSharp.Core ссылались на сборку среды выполнения, установленную в моей системе напрямую, вместо использования пакета NuGet. Т.е. у ссылки не было пути подсказки, указывающей на папку пакетов NuGet, и поэтому он выбирал сборку из C:\Program Files\FSharp\...
из F# SDK. Я решил эту проблему, удалив ссылку и переустановив пакет FSharp.Core NuGet.
Итак, это:
<Reference Include="FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
Превращается в:
<Reference Include="FSharp.Core, Version=4.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll</HintPath>
<Private>True</Private>
</Reference>
Проверьте ссылки на сборки в сообщении. Для меня у меня была ссылка на сборку X, в которой была ссылка на Y. Поскольку Y отсутствовал, я получил эту ошибку. Ссылаясь на Y, ошибка была решена для меня.