Avviso compilatore C # 1685
-
03-07-2019 - |
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.
-
Non sto eseguendo due diversi versioni di .NET Framework (a meno che non conti 2.0 e 3.5).
-
Non mi riferisco a nessun bizzarro assemblee che potrebbero farmi sospettoso.
-
Non ricordo di aver apportato modifiche alla mia applicazione che avrebbero stimolato questa modifica.
-
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 ??li>
- System.Data ??li>
- 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 ??li>
- 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.
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
- Apri Reflector.exe
- Aggiungi tutti gli assembly non di sistema
- 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