Ne peut pas résoudre la dépendance à assembler FSharp.Noyau 4.4.1.0 lors de L'utilisation de VS 2017
je me développe dans 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 le tout nouveau VS pour le travail de développement, mais encore pour un certain temps garder les projets comme VS 2015, f # 4.0, .NET 4.5.2. Le serveur de compilation devra également utiliser VS 2015 pendant un certain temps.
pour autant que je m'en souvienne, ce genre de scénario n'a pas posé de problème dans les versions précédentes de VS, mais je ne pense pas avoir utilisé F# à ce moment-là. temps.
j'ai ouvert la solution et essayé de compiler. Je reçois cette erreur dans un projet d'application C#. (Il y a d'autres applications C#, et au moins une référence à une bibliothèque F#.)
erreur de construction inconnue, 'ne peut pas résoudre la dépendance à assembler' FSharp.Core, Version = 4.4.1.0, Culture=neutral, PublicKeyToken = b03f5f7f11d50a3a' parce qu'il n'a pas été préchargé. Lors de L'utilisation de L'APIs ReflectionOnly, les assemblages dépendants doivent être pré-chargés ou chargés à la demande par L'événement Reflectiononlyresolveassembly.
Tous mes projets F# dans la solution sont 4.0 (4.4.0.0). Je l'ai vérifié.
pourquoi cela se produit-il?
3 réponses
j'ai cherché "4.4.1.0", et j'ai découvert que le dossier "obj" du projet C# avait un .EXE.fichier de configuration qui différait de l'application.config. Il avait cette information supplémentaire qui n'est pas dans l'application.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 ceci est-il ajouté automatiquement, et pourquoi seulement dans ce projet C# particulier?
j'ai essayé de copier cette section de l'application.config du projet, et de le modifier pour 4.4.0.0 dans les deux endroits, mais cela ne fonctionne pas. Aussi essayé d'utiliser "4.4.1.0 "comme limite supérieure de l'ancienne version, et ont" 4.4.0.0 " comme nouvelle version, mais ne fonctionnait toujours pas. Même erreur du compilateur.
puis j'ai enlevé cette section, et j'ai fait référence à FSharp.De base 4.4.0.0 dans le projet c#. Cela a finalement permis de supprimer 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 une de ses dépendances. L'assemblée manifeste définition ne correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040)
j'ai réinséré la section avec la redirection, et maintenant, le programme s'exécute correctement.
Juste 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" />
j'ai eu le même problème, c'est peut-être utile pour quelqu'un:
dans mon cas, la cause était que certains de mes projets C# avec des dépendances transitoires sur FSharp.Core référençait l'ensemble d'exécution installé sur mon système directement, au lieu d'utiliser le paquet NuGet. C'est-à-dire: la référence n'avait pas de chemin d'indication pointant vers le dossier des paquets NuGet, et donc sélectionnait l'ensemble à partir de
Donc:
<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>
vérifier les références d'assemblage de l'assemblage dans le message. Pour moi, j'avais une référence à assembly X qui avait une référence à Y. parce que Y manquait, j'ai eu cette erreur. En faisant référence à Y, l'erreur a été résolue pour moi.