Je développe depuis VS 2015 et F # 4.0 (4.4.0.0) depuis un certain temps.
Avec la sortie de VS 2017, je veux ouvrir des solutions dans les plus récents VS pour le travail de développement, mais garder encore un certain temps les projets comme VS 2015, F # 4.0, .NET 4.5.2. Le serveur de build devra également utiliser VS 2015 pendant un certain temps.
Pour autant que je me souvienne, ce genre de scénario n'a pas été problématique dans les mises à niveau antérieures de la version VS, mais je ne pense pas avoir utilisé F # à ce moment-là.
J'ai ouvert la solution et essayé de compiler. J'obtiens cette erreur dans un projet d'application C #. (Il existe d'autres applications C # et au moins une référence à une bibliothèque F #.)
Erreur de génération inconnue, 'Impossible de résoudre la dépendance à l'assembly' FSharp.Core, Version = 4.4.1.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'car il n'a pas été préchargé. Lors de l'utilisation des API ReflectionOnly, les assemblys dépendants doivent être préchargé ou chargé à la demande via l'événement ReflectionOnlyAssemblyResolve.
Tous mes projets F # dans la solution sont 4.0 (4.4.0.0). J'ai revérifié.
Pourquoi cela arrive-t-il?
J'ai recherché "4.4.1.0" et découvert que le dossier "obj" du projet C # avait un fichier .exe.config différent de app.config. Il avait cette information supplémentaire qui n'est pas dans le fichier app.config du projet.
<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>
Pourquoi cela est-il ajouté automatiquement et pourquoi uniquement dans ce projet C # particulier?
J'ai essayé de copier cette section dans app.config du projet et de la changer en 4.4.0.0 aux deux endroits, mais cela n'a pas fonctionné. J'ai également essayé d'utiliser "4.4.1.0" comme limite supérieure de l'ancienne version et d'avoir "4.4.0.0" comme nouvelle version, mais cela n'a toujours pas fonctionné. Même erreur du compilateur.
Ensuite, j'ai supprimé cette section et j'ai référencé FSharp.Core 4.4.0.0 dans le projet C #. Cela s'est finalement débarrassé de l'erreur de compilation.
J'ai dirigé le programme. Il s'est écrasé avec cette exception.
Exception non gérée: impossible de charger le fichier ou l'assembly 'FSharp.Core, Version = 4.4.1.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' ou l'une de ses dépendances. La définition du manifeste de l'assembly localisé ne correspond pas à la référence de l'assembly. (Exception de HRESULT: 0x80131040)
J'ai réinséré la section avec la redirection, et maintenant le programme fonctionne bien.
Pour résumer, j'ai ajouté une référence à FSharp.Core 4.0, et la redirection ressemble à ceci
<bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.0.0" />
Avec ces modifications, la solution fonctionne toujours comme prévu également dans VS 2015.
J'ai eu le même problème, peut-être que cela est utile pour quelqu'un:
Dans mon cas, la cause était que certains de mes projets C # avec des dépendances transitoires sur FSharp.Core faisaient directement référence à l'assembly du runtime installé sur mon système, au lieu d'utiliser le package NuGet. C'est à dire. la référence n'avait pas de chemin d'indication pointant vers le dossier des packages NuGet, et donc sélectionnait l'assembly à partir de C:\Program Files\FSharp\...
à partir du SDK F #. J'ai résolu ce problème en supprimant la référence et en réinstallant le package FSharp.Core NuGet.
Donc ça:
<Reference Include="FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
Se transforme en:
<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>