Domanda

Quindi, (apparentemente) all'improvviso, il mio progetto inizia a ricevere l'avviso del compilatore 1685:

  

Il tipo predefinito   'System.Runtime.CompilerServices.ExtensionAttribute'   è definito in più assiemi in   l'alias globale; usando la definizione   da 'c: \ Programmi \ Riferimento   Assemblee Microsoft \ Framework \ v3.5 \ \ System.Core.dll '

Perplesso, ho studiato l'articolo MSDN per capire la sua causa. Ecco le informazioni che ho trovato:

  

Riferimenti su Visual C #: errori e   Avvisi Avviso compilatore (livello 1)   CS1685

     

Messaggio di errore Il tipo predefinito   'Nome system.type' è definito in   più assiemi nel globale   alias; usando la definizione da 'File   Nome '

     

Questo errore si verifica quando un predefinito   tipo di sistema come System.int32 è   trovato in due assemblee. Un modo questo   può succedere se ti riferisci   mscorlib da due posti diversi,   come provare a eseguire the.Net   Framework versioni 1.0 e 1.1   side-by-side.

     

Il compilatore utilizzerà la definizione   da una sola delle assemblee. Il   il compilatore cerca solo alias globali,   non cerca le librerie definite   /riferimento. Se hai specificato   / nostdlib, il compilatore cercherà   per Object e in futuro iniziare   tutte le ricerche per tipi predefiniti in   il file in cui è stato trovato Object.

Ora mi sto davvero grattando la testa.

  1. Non sto eseguendo due diversi versioni di .NET Framework (a meno che non conti 2.0 e 3.5).

  2. Non mi riferisco a nessun bizzarro assemblee che potrebbero farmi sospettoso.

  3. Non ricordo di aver apportato modifiche alla mia applicazione che avrebbero stimolato questa modifica.

  4. Ho verificato che tutti i componenti hanno come destinazione .NET Framework versione v2.0.50727.

Sono aperto a suggerimenti o idee su come correggerlo. Considero gli avvisi come errori e mi sta facendo impazzire.

Ciò che mi dà veramente fastidio è che non so perché si sta verificando. Le cose che accadono dovrebbero avere una causa riconoscibile e dovrei sapere perché sono successe. Se non riesco a spiegarlo, non posso risolverlo accuratamente. Le congetture non sono mai soddisfacenti.

L'applicazione è semplice, composta da una libreria di classi e un'applicazione Windows Form.

  • Una DLL di libreria di classe C # che fornisce funzionalità di base che incapsulano l'accesso al database. Questa DLL fa riferimento ai seguenti componenti:

    • Sistema
    • System.Core
    • System.Core.Data
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Drawing
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq
  • Un'applicazione Windows Form C # che fornisce l'interfaccia utente. Questa applicazione fa riferimento ai seguenti componenti:

    • CleanCode
    • CleanCodeControls (entrambi forniscono supporto per l'editor di sintassi e sono localmente basati su .NET 3.5).
    • LINQBridge
    • Roswell.Framework (la libreria di classi sopra)
    • 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

Fammi sapere se hai bisogno di ulteriori informazioni e le fornirò volentieri.

È stato utile?

Soluzione

LINQBridge mi rende immediatamente sospettoso. Lo scopo è quello di fornire attributi / metodi di estensione ecc. Per gli utenti 2.0. Se si dispone di 3.5 (System.Core.dll), non utilizzare LINQBridge. Se hai hai bisogno di LINQBridge in 3.5 per qualche oscuro motivo (e non riesco a pensarne uno), allora potresti dover usare un alias esterno. Ma davvero dubito che tu ne abbia bisogno!

Altri suggerimenti

Un altro modo semplice per verificare: Nel tuo codice, usa temporaneamente la classe da qualche parte. Esempio:

System.Runtime.CompilerServices.ExtensionAttribute x = null;

Durante la creazione, questo genererà un errore:

  

Il tipo 'System.Runtime.CompilerServices.ExtensionAttribute' esiste   in entrambi 'c: \ Programmi \ Riferimento   Assiemi \ Microsoft \ Framework \ v3.5 \ System.Core.dll "e .....

E mostrarti immediatamente le 2 fonti che causano il conflitto.

Marc ha quasi certamente ragione. Ecco un modo per verificare

  1. Apri Reflector.exe
  2. Aggiungi tutti gli assembly non di sistema
  3. F3 e cerca ExtensionAttribute

Se compare ovunque oltre a System.Core, allora sai da dove proviene.

Un'altra soluzione per questo problema è utilizzare un alias globale per l'intero assembly:

Riferimento - > Proprietà - > Alias ??- > Sostituisci "globale" con qualcos'altro

Cordiali saluti: ho avuto lo stesso problema e sono stato in grado di risolverlo utilizzando Resharper "Ottimizza i riferimenti" comando, quindi rimuovendo tutti i riferimenti non utilizzati. Non è del tutto sicuro perché ha funzionato, ma ha funzionato.

Un'altra soluzione per questo problema = > Progetto clic destro - > Proprietà - > Crea - > Tratta gli avvisi come errori - > Nessuno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top