Pergunta

Assim, (aparentemente) fora do azul, meu projeto começa a ficar aviso do compilador 1685:

O tipo predefinido 'System.Runtime.CompilerServices.ExtensionAttribute' é definido em vários conjuntos em o alias globais; usando definição do 'c: \ Program Files \ Reference Assembléias \ Microsoft \ Framework \ v3.5 \ System.Core.dll '

Perplexos, eu pesquisei o artigo do MSDN para descobrir sua causa. Aqui está a informação que eu encontrei:

Visual C # Referência: Erros e Avisos aviso do compilador (nível 1) CS1685

Mensagem de erro O pré-definido tipo 'Nome System.Type' é definido no várias montagens no mundial apelido; usando a definição de 'Arquivo Nome '

Este erro ocorre quando um predefinidos tipo de sistema, tal como é System.Int32 encontrado em dois conjuntos. Uma forma isso pode acontecer é se você está fazendo referência mscorlib de dois lugares diferentes, tais como tentar executar the.Net Quadro versões 1.0 e 1.1 lado a lado.

O compilador usará a definição a partir de apenas um dos conjuntos. o compilador procura apenas aliases globais, não pesquisa bibliotecas definidas /referência. Se você tiver especificado / Nostdlib, o compilador irá procurar para Object, e no futuro começo todas as pesquisas para tipos predefinidos no o arquivo onde encontrou objeto.

Agora eu realmente estou coçar a cabeça.

  1. Eu não estou correndo dois diferentes versões do .NET Framework (A menos que você conte 2.0 e 3.5).

  2. Eu não estou fazendo referência qualquer bizarro conjuntos que pode me fazer suspeito.

  3. Não me lembro de fazer quaisquer alterações ao meu aplicativo que iria estimular essa mudança.

  4. eu tenho verificado que todos os componentes alvo .NET Framework versão v2.0.50727.

Estou aberto a sugestões ou idéias sobre como corrigir isso. I tratar avisos como erros, e isso está me deixando louco.

O que realmente me incomoda sobre isso é que eu não sei por que está ocorrendo. Coisas que acontecem deve ter uma causa discernível, e eu deveria saber por que aconteceu. Se eu não posso explicar, eu não posso remediá-lo com precisão. Conjecturas não é satisfatória.

A aplicação é simples, consistindo de uma biblioteca de classes, e uma aplicação Windows Forms.

  • A C DLL biblioteca # classe fornecendo funcionalidade básica encapsular acesso de banco de dados. Esta DLL referências os seguintes 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
  • Uma aplicação C # Windows Forms proporcionando a interface do usuário. Esta aplicação referências os seguintes componentes:

    • CleanCode
    • CleanCodeControls (ambos estes fornecem suporte ao editor de sintaxe, e são construídos localmente contra .NET 3.5).
    • LINQBridge
    • Roswell.Framework (a biblioteca de classes acima)
    • 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

Deixe-me saber se você precisar de mais informações e eu vou com prazer fornecê-la.

Foi útil?

Solução

LINQBridge me faz imediatamente suspeito. Toda a intenção da presente é proporcionar extensão de atributos / etc métodos para utilizadores 2.0. Se você tiver 3.5 (System.Core.dll), não use LINQBridge. Se você não necessidade LINQBridge em 3,5 por alguma razão obscura (e eu não consigo pensar em um), então você pode ter que usar um alias extern. Mas eu realmente duvido que você precisar!

Outras dicas

Outra forma fácil de verificar: Em seu código, use temporariamente o lugar de classe. Exemplo:

System.Runtime.CompilerServices.ExtensionAttribute x = null;

Ao construir, isso vai gerar erro:

O tipo 'System.Runtime.CompilerServices.ExtensionAttribute' existe tanto 'c: \ Program Files \ Reference Assembléias \ Microsoft \ Framework \ v3.5 \ System.Core.dll' e .....

E mostrar-lhe imediatamente as 2 fontes causando o conflito.

Marc é quase certamente correta. Aqui está uma maneira de verificar

  1. Open reflector.exe
  2. Adicionar todos os conjuntos não são do sistema
  3. F3 e procurar ExtensionAttribute

Se ele aparece em qualquer lugar além System.Core então você sabe onde ele está vindo.

Outra solução para este problema é usar um apelido global para toda a assembléia:

Referência -> Propriedades -> Aliases -> Substituir 'global' com outra coisa

FYI: Eu tive o mesmo problema e foi capaz de resolvê-lo usando o comando "otimizar Referências" do ReSharper, e, em seguida, removendo todas as referências não utilizadas. Não completamente certo de por que funcionou, mas ele fez.

Outra solução para este problema => projeto Botão direito do mouse -> Propriedades -> Build -> avisos tratar como erros -> Nenhum

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top