2017-03-08 9 views
17

Pracuję w VS 2015 i F # 4.0 (4.4.0.0) przez dłuższy czas.Nie można rozwiązać zależności od złożenia FSharp.Core 4.4.1.0 podczas korzystania z VS 2017

Wraz z wydaniem VS 2017, chcę otworzyć rozwiązania w najnowszym VS do prac rozwojowych, ale jeszcze przez jakiś czas utrzymywać projekty jako VS 2015, F # 4.0, .NET 4.5.2. Serwer budujący będzie też musiał używać VS 2015 przez jakiś czas.

O ile pamiętam, tego rodzaju scenariusz nie był problematyczny we wcześniejszych wersjach wersji VS, ale nie sądzę, żebym użył F # w tym czasie.

Otworzyłem rozwiązanie i próbowałem skompilować. Otrzymuję ten błąd w projekcie aplikacji C#. (Istnieją inne aplikacje C#, a co najmniej jeden odwołuje się F # biblioteka.)

Nieznany błąd kompilacji 'Nie można rozwiązać zależność montażem' FSharp.Core, Version = 4.4.1.0, Culture = neutral, TokenKluczaPublicznego = b03f5f7f11d50a3a "ponieważ nie został wcześniej załadowany. Podczas korzystania z interfejsów API ReflectionOnly, zależne zespoły muszą być wstępnie załadowane lub załadowane na żądanie za pośrednictwem zdarzenia ReflectionOnlyAssemblyResolve.

Wszystkie moje projekty F # w rozwiązaniu to 4.0 (4.4.0.0). Sprawdziłem dwukrotnie.

Dlaczego tak się dzieje?

Odpowiedz

16

Szukałem "4.4.1.0" i odkryłem, że folder "obj" projektu C# miał plik .exe.config, który różni się od app.config. Miał te dodatkowe informacje, których nie ma w app.config projektu.

<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> 

Dlaczego ten dodatek jest automatycznie i dlaczego tylko w tym konkretnym projekcie C#?

Próbowałem skopiować tę sekcję do pliku app.config projektu i zmienić ją na 4.4.0.0 w obu miejscach, ale to nie zadziałało. Starałem się również używać "4.4.1.0" jako górnego limitu starej wersji i mieć "4.4.0.0" jako nową wersję, ale nadal nie działało. Ten sam błąd kompilatora.

Następnie usunąłem tę sekcję i odniosłem się do FSharp.Core 4.4.0.0 w projekcie C#. To w końcu pozbyło się błędu kompilacji.

Uruchomiłem program. Rozbił się z tym wyjątkiem.

Nieobsługiwany wyjątek: Nie można załadować pliku lub zestawu "FSharp.Core, wersja = 4.4.1.0, Culture = neutralny, PublicKeyToken = b03f5f7f11d50a3a" lub jedna z jego zależności. Definicja manifestu zlokalizowanego złożenia nie pasuje do odwołania do zespołu. (Wyjątek od HRESULT: 0x80131040)

Ponownie wstawiłem sekcję z przekierowaniem, a teraz program działa poprawnie.

Wystarczy, aby podsumować, dodałem odniesienie do FSharp.Core 4.0 i przekierowanie wygląda to

<bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.0.0" /> 

z tymi modyfikacjami, roztwór nadal działa zgodnie z oczekiwaniami, również w VS 2015.

+0

Powyższy problem dotyczył programu C#, który korzystał z bibliotek F #. Dzisiaj miałem podobny problem z programem F # przy użyciu F # 4.0.0.0 w VS 2017. Nie wystąpił błąd kompilacji, tylko powyższy błąd środowiska wykonawczego. Rozwiązałem go za pomocą bindingRedirect, jak wyjaśniono tutaj. Nie rozumiem, dlaczego tak się dzieje tylko w przypadku niektórych moich programów. –

+1

Wygląda na to, że nie mogę sprawdzić wyrażeń podczas debugowania. Dodanie zegarka pokazuje błąd: błąd CS1705: Zgromadzenie "x" z identyfikacją "x" używa "FSharp.Core, wersja = 4.4.1.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a", który ma wyższą wersję niż zespół referencyjny "FSharp. Core "z tożsamością" FSharp.Core, wersja = 4.4.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a ' – Nuzzolilo

+0

Awesome! To działało dla mnie jak urok. Dzięki! –

-2

Sprawdź odniesienia zespołu zespołu w komunikacie. Dla mnie miałem odniesienie do zespołu X, który miał odniesienie do Y. Ponieważ Y brakowało, dostałem ten błąd. Odwołując się do Y, błąd został rozwiązany dla mnie.