2009-03-02 18 views
43

Tak (pozornie) out of the blue, mój projekt rozpoczyna się ostrzeżenie kompilatora 1685:kompilator C# Ostrzeżenie 1685

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'

Zakłopotany, badałem artykuł MSDN, aby dowiedzieć się, jego przyczyny. Oto informacje, które znalazłem:

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.

Teraz naprawdę drapię się po głowie.

  1. Nie uciekam dwa różne wersje Framework (jeśli nie liczyć 2.0 i 3.5).

  2. Nie odwołuję się do żadnych dziwacznych zespołów , które mogą sprawiać, że podejrzane będą mnie podejrzane .

  3. Nie przypominam sobie o żadnych zmianach w mojej aplikacji, które spowodowałyby tę zmianę.

  4. Sprawdziłem, że wszystkie komponenty są przeznaczone dla platformy .NET Framework w wersji 2.0.50727.

Jestem otwarty na sugestie lub pomysły, jak to poprawić. Traktuję ostrzeżenia jako błędy i to doprowadza mnie do szału.

To, co mnie naprawdę nurtuje, polega na tym, że nie wiem, , dlaczego występuje. To, co się dzieje, powinno mieć wyraźną przyczynę i powinienem wiedzieć, dlaczego tak się stało. Jeśli nie potrafię tego wyjaśnić, nie mogę tego dokładnie naprawić. Zgadywanie nigdy nie jest zadowalające.

Aplikacja jest prosta, składa się z biblioteki klas i aplikacji formularzy okien.

  • Biblioteka DLL klasy C zapewniająca podstawową funkcjonalność obejmującą dostęp do bazy danych. Ten DLL odwołuje się następujące składniki:

    • systemowe
    • System.Core
    • System.Core.Data
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Drawing
    • System.Windows.Forms
    • wniosek zawierający UI
    • System.Xml
    • System.Xml.Linq
  • C# Windows Forms. Ta aplikacja odwołuje się następujące składniki:

    • CleanCode
    • CleanCodeControls (oba te zapewniają wsparcie edytor składni i są lokalnie zbudowany na .NET 3.5).
    • LinqBridge
    • Roswell.Framework (biblioteka klasy wyżej)
    • systemu
    • System.Core
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Deployment
    • System.Design
    • System.Drawing
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq

Daj mi znać, jeśli potrzebujesz dodatkowych informacji, a ja chętnie dostarczyć .

+0

zobacz: http://stackoverflow.com/questions/546819/strange- warning-about-extensionattribute Sugerujemy zamknięcie pytania, że ​​jest to dokładny duplikat – ShuggyCoUk

+0

Nawiasem mówiąc, rzeczywiście jest to LinqBridge, który to powoduje, już go nie potrzebujesz – ShuggyCoUk

+0

Zrobiłem wyszukiwanie na numerze ostrzegawczym i nie mogłem znaleźć żadnych pytań które to zawierało; moje przeprosiny za duplikat. Nawiasem mówiąc, LinqBridge WAS, w rzeczywistości, problem. Dziękuję Ci! –

Odpowiedz

22

LINQBridge czyni mnie natychmiast podejrzanym. Cała intencja ma na celu zapewnienie rozszerzenia atrybutów/metod itp. Dla 2.0 użytkowników. Jeśli masz 3.5 (System.Core.dll), nie używaj LINQBridge. Jeśli masz do potrzebujesz LINQBridge w 3.5 z jakiegoś niejasnego powodu (i nie mogę myśleć o jednym), to może będziesz musiał użyć zewnętrznego aliasu. Ale ja naprawdę wątpię, że tego potrzebujesz!

+0

Tak, to była przyczyna, w porządku! Stukrotne dzięki! –

22

Marc jest prawie na pewno poprawny. Oto sposób, aby zweryfikować

  1. Otwórz Reflector.exe
  2. Dodaj wszystkich zespołów niesystemowym
  3. F3 i szukać extensionAttribute

Jeśli pojawia się gdziekolwiek poza System.Core wtedy wiedzieć, skąd pochodzi.

+0

+1 Ta odpowiedź jest poprawna w bardziej ogólnym przypadku. –

+1

Właśnie użyłem 'grep -r ExtensionAttribute *' w moim katalogu projektu i znalazłem w ten sposób winowajcę. – palswim

9

Innym rozwiązaniem tego problemu jest użycie globalnego alias dla całego zespołu:

Reference -> Właściwości -> Aliasy -> Wymień „globalny” coś innego

+1

Użyj "extern alias smth" w kodzie – gabba

90

kolejny łatwy sposób sprawdzić: W kodzie tymczasowo użyj gdzieś klasy. Przykład:

System.Runtime.CompilerServices.ExtensionAttribute x = null; 

Podczas budowy, to wygeneruje błąd:

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

i pokazać natychmiast z 2 źródeł powoduje konflikt.

+2

Cool. W rzeczywistości nie musiałem nawet budować, gdy tylko wkleiłem tę linię do pliku kodu, ostrzeżenie intellisense powiedziało mi wszystko, co musiałem wiedzieć! – demoncodemonkey

+6

Ten zasługuje na więcej przebojów! – LeffeBrune

+2

To jest ogólniejsza odpowiedź. –

5

FYI: Miałem ten sam problem i udało mi się go rozwiązać za pomocą polecenia Resharper "Optimize References", a następnie usunięto wszystkie nieużywane referencje. Nie jestem do końca pewny, dlaczego to zadziałało, ale tak się stało.

-3

Innym rozwiązaniem tego problemu => Prawo projekt click -> Właściwości -> Build -> Ostrzeżenia uznać za błędy -> Brak

+3

Nigdy bym na to nie pozwolił. Właściwy kod nie zawiera ostrzeżeń. To jest jak zamiatanie go pod dywan. To ostrzeżenie może i dlatego powinno zostać rozwiązane. –

Powiązane problemy