web-dev-qa-db-fra.com

Ajouter une référence à System.Core quand il est déjà référencé par le système de construction

Visual Studio Intellisense ne reconnaît pas le mot clé dynamique, même si le projet est généré. J'ai essayé d'ajouter une référence à System.Core pour résoudre le problème. Je reçois cette erreur: 

Une référence à 'System.Core' n'a pas pu être ajoutée. Ce composant est déjà automatiquement référencé par le système de compilation.

J'ai remarqué que d'autres de mes projets font référence à System.Core. Ma solution était de l'ajouter en modifiant directement le fichier csproj, ce qui corrigeait l'Intellisense. Ce qui donne? Pourquoi VS ne me permet-il pas de le faire via l'interface utilisateur?

29
Shaun Luttin

Après quelques recherches, tout ce que je pouvais trouver, c’était des billets SO précédents et des blogs. Au final, ils utilisaient tous le même traitement que vous. Ensuite, j'ai trouvé un rapport de bogue une personne classée sur Microsoft Connect en 2011, à laquelle un responsable plus tard, environ un an plus tard, a répondu: Chuck England, un employé de MSFT.

TL; DR - L'équipe a délibérément pris une décision en raison de la fonctionnalité multi-ciblage ajoutée à VS2008 (possibilité de modifier la cible .NET Framework d'un projet).

Etant donné que le framework ciblé nécessite "System.Core", sa suppression empêcherait la construction (pour autant que je puisse comprendre la réponse de Chuck))}, ils ont décidé de forcer une référence à ce dernier même voyez-le dans la liste des références.

On pourrait dire qu’il s’agit d’un hack de "sécurité" avec un effet secondaire indésirable: il renvoie cette erreur lorsque vous essayez de la rajouter aux références, ce qui entraîne la nécessité de modifier directement le fichier de projet.


Microsoft Connect a pris sa retraite en 2018, mais voici une combinaison des réponses reçues:

Oui, l'expérience n'est pas géniale. Comme System.Core est requis, vous ne devez jamais le supprimer. Nous avons corrigé cela en l'ajoutant pour vous même si vous supprimez la référence. [A] s le message que vous avez vu indique, System.Core est implicitement référencé. Ainsi, le fait que vous l'ayez supprimé, à l'exception de la suppression physique d'une ligne du fichier de projet, n'a pas modifié la construction. 

Il existe des scénarios légitimes dans lesquels vous voudrez peut-être être en mesure de le faire, mais il s'agit d'un cas très délicat. Cependant, nous devrions ignorer aveuglément le fait que lorsque vous le rajoutez, une erreur est générée. Une grande partie de cela nous a été imposé par les versions précédentes qui ne comprenaient pas le multi-ciblage et qui n’étaient tout simplement pas nettoyées.

Vous pouvez le rajouter manuellement en cliquant avec le bouton droit de la souris sur le nœud du projet et en sélectionnant Décharger. Cliquez à nouveau avec le bouton droit sur le nœud du projet et sélectionnez Modifier. Dans l'éditeur, copiez une autre ligne de référence (par exemple, celle correspondant à "Système") et collez-la sous la référence d'origine à l'intérieur du même groupe d'élément. Changez le nom de référence en "System.Core". Cliquez avec le bouton droit sur le nœud du projet et sélectionnez Recharger. Choisissez "oui" comme question pour sauvegarder et recharger.

VS2008 n'a pas géré correctement le ciblage multiple. Cela vous permettrait de construire des choses qui n'étaient pas légitimes. Avec VS2010, nous nous sommes efforcés de faire en sorte que s’il fonctionne pour le cadre cible, il s’exécutera sur le cadre cible. Je ne peux pas dire que je connais des endroits où ce n'est pas vrai.

Nous ne pouvons pas revenir à la méthode VS2008, car elle ne comprend pas le multi-ciblage. Il n'a pas non plus compris de vrais "profils", comme le profil client du framework .NET 4.0. En fait, le problème que vous voyez est dû au fait que le système VS2008 a été mis à niveau pour prendre en charge le ciblage multiple et que c'est le nouvel ensemble de règles qui rejette la référence.

Dans ce cas, nous construisons même si vous avez supprimé une référence. Vous pourriez dire, mais cela n'aurait pas dû être construit. Mais, il fonctionnera sur le cadre ciblé et aurait donc dû être construit. Le fait que nous ayons ajouté une référence "requise" pour vous est en quelque sorte une expérience ratée dans son développement.

Nous n'avons tout simplement pas compris cela assez tôt, et avec une compréhension très solide de la façon dont nous pourrions résoudre ce problème afin d'obtenir un correctif avant notre publication. Cependant, le fait que vous deviez toujours faire référence, et donc ne jamais supprimer "System.Core", en a fait une réparation irréprochable, puisque 99% des clients ne le feraient jamais.

35
Grant

En me basant sur la réponse de @ Arthur, j'ai trouvé deux choses qui ont résolu le problème:

Ajoutez au fichier .csproj, la ligne manquante:

<Reference Include="System.Core" />

Ensuite, selon une réponse de forums.asp.net, ajoutez la référence d'assemblage System.Core dans le web.config principal ( et non celui sous Vues ):

  <system.web>
    <compilation debug="true" targetFramework="4.7.1">
      <assemblies>
        <add Assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add Assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add Assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.7.1" />
    <!-- ... ... -->
  </system.web>

Ensuite:

1) Assurez-vous que la version du framework .NET pour la propriété de compilation dans web.config est identique à celle spécifiée dans les propriétés du projet.

2) Assurez-vous que la version de MVC Assembly dans le dossier de vues web.config est identique à celle de MVC Assembly que vous utilisez dans votre projet.

3) Redémarrez Visual Studio (2017 ici).

J'espère que cela t'aides.

7
woohoo

Récupéré en ajoutant manuellement ces lignes au fichier .csproj:

<Reference Include="System" />
<Reference Include="System.Core" />
4
Arthur


bonjour là-bas, je sais que ce message est déjà ancien, mais pour ceux qui recherchent encore une solution, espérons que cela pourra vous aider. Comme je suis également confronté au même problème parce que j’ai supprimé accidentellement la dll System.Core.

Et ce que j’ai fait c’est que j’ai copié cette dll à partir de C:\Program Files (x86)\Assemblys de référence\Microsoft\Framework.NETFramework\v4.6.1\System.Core.dll et que je les ai collées dans mon projet poubelle.

Plus tard, vous pouvez voir qu’à l’intérieur de votre projet, la DLL est ajoutée automatiquement à la référence. Après cela, je redémarre mon vs et cela fonctionne! Goodluck n espérons que cela peut résoudre votre problème

1
warabino