2009-03-02 16 views
43

Por lo tanto, (aparentemente) de la nada, mi proyecto empieza a ser advertencia del compilador 1685:compilador de C# 1685 Advertencia

The predefined type 'System.Runtime.CompilerServices.ExtensionAttribute' is defined in multiple assemblies in the global alias; using definition from 'c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'

Perplejo, que investigó el artículo de MSDN para averiguar su causa. Aquí está la información que encontré:

Visual C# Reference: Errors and Warnings Compiler Warning (level 1) CS1685

Error Message The predefined type 'System.type name' is defined in multiple assemblies in the global alias; using definition from 'File Name'

This error occurs when a predefined system type such as System.int32 is found in two assemblies. One way this can happen is if you are referencing mscorlib from two different places, such as trying to run the.Net Framework versions 1.0 and 1.1 side-by-side.

The compiler will use the definition from only one of the assemblies. The compiler searches only global aliases, does not search libraries defined /reference. If you have specified /nostdlib, the compiler will search for Object, and in the future start all searches for predefined types in the file where it found Object.

Ahora estoy realmente rascándome la cabeza.

  1. No estoy corriendo dos diferentes versiones de .NET Framework (a menos que cuente 2.0 y 3.5).

  2. No estoy haciendo referencia a ningún asambleas extraños que puedan hacerme sospechoso.

  3. No recuerdo haber realizado ningún cambio en mi aplicación que pudiera provocar este cambio.

  4. He verificado que todos los componentes tienen como objetivo .NET Framework versión v2.0.50727.

Estoy abierto a sugerencias o ideas sobre cómo corregir esto. Trato las advertencias como errores, y me está volviendo loco.

Lo que realmente me molesta es que no sé por qué está ocurriendo. Las cosas que suceden deberían tener una causa discernible, y yo debería saber por qué sucedieron. Si no puedo explicarlo, no puedo remediarlo con precisión. La conjetura nunca es satisfactoria.

La aplicación es sencilla, consiste en una biblioteca de clases y una aplicación de formularios de Windows.

  • Una biblioteca de clase C# DLL que proporciona una funcionalidad básica que encapsula el acceso a la base de datos. Esta DLL hace referencia a los siguientes componentes:

    • sistema
    • System.Core
    • System.Core.Data
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Drawing
    • System.Windows.Forms
    • System.XML
    • System.Xml.Linq
  • A C# Windows Forms aplicación que proporciona la interfaz de usuario. Esta aplicación hace referencia a los siguientes componentes:

    • CleanCode
    • CleanCodeControls (ambos proporcionan soporte editor de sintaxis, y están construidos localmente contra .NET 3.5).
    • LinqBridge
    • Roswell.Framework (la biblioteca de clases arriba)
    • Sistema
    • System.Core
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Deployment
    • System.Design
    • System.Drawing
    • System.Windows.Forms
    • System.XML
    • System.Xml.Linq

Avísame si necesita más información y yo con mucho gusto le proporcione .

+0

ver lo siguiente: http://stackoverflow.com/questions/546819/strange- warning-about-extensionattribute sugiero que cierre la pregunta que es un duplicado exacto – ShuggyCoUk

+0

por cierto, de hecho es LinqBridge que está causando esto, ya no lo necesita en absoluto – ShuggyCoUk

+0

Hice una búsqueda en el número de advertencia y no pude encontrar ninguna pregunta que lo contenía; mis disculpas por el duplicado. Por cierto, LinqBridge ERA, de hecho, el problema. ¡Gracias! –

Respuesta

22

LINQBridge me hace sospechar de inmediato. Todo el intento de esto es proporcionar atributos/métodos de extensión, etc. para usuarios 2.0. Si tiene 3.5 (System.Core.dll), no use LINQBridge. Si hace necesita LINQBridge en 3.5 por algún motivo oscuro (y no puedo pensar en uno), entonces puede que tenga que usar un alias externo. Pero yo Realmente ¡Dudas que lo necesites!

+0

Sí, esa fue la causa, ¡está bien! ¡Un millón de gracias! –

22

Marc es casi seguro que correcto. He aquí una manera de verificar

  1. abierto Reflector.exe
  2. Añadir todas las asambleas no pertenecientes al sistema
  3. F3 y buscar extensionAttribute

Si aparece cualquier lugar, además de System.Core entonces saber de dónde viene.

+0

+1 Esta respuesta es correcta para el caso más general. –

+1

Acabo de utilizar 'grep -r ExtensionAttribute *' en mi directorio de proyectos y encontré al culpable de esa manera. – palswim

9

Otra solución para este problema es utilizar un alias global para toda la asamblea:

Referencia -> Propiedades -> Alias ​​-> Reemplazar 'global' con algo más

+1

Y use 'extern alias smth' en el código – gabba

90

Otra forma fácil de comprobar: En su código, use temporalmente la clase en algún lugar. Ejemplo:

System.Runtime.CompilerServices.ExtensionAttribute x = null; 

Cuando la construcción, esto generará error:

The type 'System.Runtime.CompilerServices.ExtensionAttribute' exists in both 'c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll' and .....

Y le mostrará inmediatamente las 2 fuentes que causan el conflicto.

+2

Cool. De hecho, ni siquiera necesité construir, tan pronto como pegué esa línea en un archivo de código, la advertencia intellisense me dijo todo lo que necesitaba saber. – demoncodemonkey

+6

¡Este merece más votos favorables! – LeffeBrune

+2

Esta es una mejor respuesta general. –

5

FYI: Tuve el mismo problema y pude resolverlo usando el comando "Optimizar referencias" de Resharper, y luego eliminé todas las referencias no utilizadas. No estoy del todo seguro por qué funcionó, pero lo hizo.

-3

Otra solución para este problema => Proyecto clic derecho -> Propiedades -> Build -> advertencias tratan como errores -> Ninguno

+3

Nunca permitiría esto. El código correcto no tiene advertencias. Esto se siente como barrer debajo de la alfombra. Esta advertencia puede y, por lo tanto, debe ser resuelta. –

Cuestiones relacionadas