web-dev-qa-db-fra.com

Avertissement du compilateur C # 1685

Donc, (apparemment) à l'improviste, mon projet commence à recevoir l'avertissement 1685 du compilateur:

Le type prédéfini "System.Runtime.CompilerServices.ExtensionAttribute" est défini dans plusieurs assemblys dans l'alias global; en utilisant la définition de 'c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'

Perplexe, j'ai recherché l'article MSDN pour comprendre sa cause. Voici les informations que j'ai trouvées:

Référence Visual C #: Avertissement du compilateur d'erreurs et d'avertissements (niveau 1) CS1685

Message d'erreur Le type prédéfini 'System.type name' est défini dans plusieurs assemblys dans l'alias global; en utilisant la définition de 'Nom de fichier'

Cette erreur se produit lorsqu'un type de système prédéfini tel que System.int32 est trouvé dans deux assemblys. Cela peut se produire si vous faites référence à mscorlib à partir de deux endroits différents, par exemple en essayant d'exécuter les versions 1.0 et 1.1 du.Net Framework côte à côte.

Le compilateur utilisera la définition d'un seul des assemblys. Le compilateur recherche uniquement les alias globaux, ne recherche pas les bibliothèques définies/référencées. Si vous avez spécifié/nostdlib, le compilateur recherchera Object, et à l'avenir démarrera toutes les recherches de types prédéfinis dans le fichier où il a trouvé Object.

Maintenant, je me gratte vraiment la tête.

  1. Je n'utilise pas deux versions différentes du .NET Framework (sauf si vous comptez 2.0 et 3.5).

  2. Je ne fais pas référence à des assemblées bizarres qui pourraient me rendre suspect.

  3. Je ne me souviens pas d'avoir apporté à mon application des modifications susceptibles de provoquer ce changement.

  4. J'ai vérifié que tous les composants ciblent la version 2.0.50727 de .NET Framework.

Je suis ouvert aux suggestions ou aux idées sur la façon de corriger cela. Je considère les avertissements comme des erreurs et cela me rend fou.

Ce qui me dérange vraiment, c'est que je ne sais pas pourquoi cela se produit. Les choses qui arrivent devraient avoir une cause discernable et je devrais savoir pourquoi elles se sont produites. Si je ne peux pas l'expliquer, je ne peux pas y remédier avec précision. Les suppositions ne sont jamais satisfaisantes.

L'application est simple, composée d'une bibliothèque de classes et d'une application Windows Forms.

  • Une bibliothèque de classes C # DLL fournissant des fonctionnalités de base encapsulant l'accès à la base de données. Cette DLL fait référence aux composants suivants:

    • Système
    • System.Core
    • System.Core.Data
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • Dessin système
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq
  • Une application Windows Forms C # fournissant l'interface utilisateur. Cette application fait référence aux composants suivants:

    • CleanCode
    • CleanCodeControls (tous deux fournissent la prise en charge de l'éditeur de syntaxe et sont construits localement avec .NET 3.5).
    • LinqBridge
    • Roswell.Framework (la bibliothèque de classes ci-dessus)
    • Système
    • System.Core
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • Déploiement du système
    • Système.Design
    • Dessin système
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq

Faites-moi savoir si vous avez besoin de plus d'informations et je serai heureux de vous les fournir.

45
Mike Hofer

LINQBridge me rend immédiatement suspect. L'intention totale de ceci est de fournir des attributs/méthodes d'extension, etc. pour les utilisateurs 2.0. Si vous avez 3.5 (System.Core.dll), n'utilisez pas LINQBridge. Si vous avez besoin de LINQBridge dans 3.5 pour une raison obscure (et je ne peux pas penser à une seule), alors vous devrez peut-être utiliser un alias externe. Mais je vraiment doute que vous en ayez besoin!

22
Marc Gravell

Un autre moyen simple de vérifier: dans votre code, utilisez temporairement la classe quelque part. Exemple:

System.Runtime.CompilerServices.ExtensionAttribute x = null;

Lors de la construction, cela générera une erreur:

Le type "System.Runtime.CompilerServices.ExtensionAttribute" existe à la fois dans "c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" et .....

Et montrez-vous immédiatement les 2 sources à l'origine du conflit.

96
Remco te Wierik

Marc a presque certainement raison. Voici un moyen de vérifier

  1. Ouvrez Reflector.exe
  2. Ajouter tous les assemblys non système
  3. F3 et recherchez ExtensionAttribute

S'il apparaît n'importe où en dehors de System.Core, vous savez d'où il vient.

22
JaredPar

Une autre solution à ce problème consiste à utiliser un alias global pour l'ensemble de l'Assemblée:

Référence -> Propriétés -> Alias ​​-> Remplacez 'global' par autre chose

9
VitalyB

FYI: J'ai eu le même problème et j'ai pu le résoudre en utilisant la commande "Optimiser les références" de Resharper, puis en supprimant toutes les références inutilisées. Pas tout à fait sûr pourquoi cela a fonctionné, mais cela a fonctionné.

5
Efrain