Предупреждение о компиляторе С# 1685
Итак, (по-видимому) из ничего, мой проект начинает получать предупреждение о компиляторе 1685:
Предопределенный тип 'System.Runtime.CompilerServices.ExtensionAttribute' определяется в нескольких сборках в глобальный псевдоним; используя определение from 'c:\Program Files\Reference Сборки \Microsoft\Framework\v3.5\System.Core.dll '
В преломлении я исследовал статью MSDN, чтобы выяснить ее причину. Вот информация, которую я нашел:
Ссылка на Visual С#: ошибки и Предупреждение о компиляторе предупреждений (уровень 1) CS1685
Сообщение об ошибке Предопределенный тип 'Имя типа System.type' определено в несколько сборок в глобальном псевдоним; используя определение из "Файл Имя
Эта ошибка возникает, когда предопределенная тип системы, такой как System.int32, является найденный в двух сборках. Один из способов может случиться, если вы ссылаетесь mscorlib из двух разных мест, например, попытку запуска программы. Рамочные версии 1.0 и 1.1 бок о бок.
Компилятор будет использовать определение только от одной из сборок. компилятор ищет только глобальные псевдонимы, не ищет библиотеки, определенные /Справка. Если вы указали /nostdlib, компилятор будет искать для объекта, и в будущем все поиски предопределенных типов в файл, в котором он нашел объект.
Теперь я действительно почесываю голову.
-
У меня нет двух разных
версии .NET Framework
(если вы не считаете 2.0 и 3.5).
-
Я не ссылаюсь ни на какие причудливые
собрания, которые могли бы сделать меня
подозрительными.
-
Я не помню внесения каких-либо изменений в мое приложение, которое подстегнет это изменение.
-
Я проверил, что все компоненты нацелены на версию .NET Framework версии 2.0.50727.
Я открыт для предложений или идей о том, как исправить это. Я рассматриваю предупреждения как ошибки, и это сводит меня с ума.
Что действительно меня беспокоит, так это то, что я не знаю, почему это происходит. Вещи, которые произойдут, должны иметь очевидную причину, и я должен знать, почему они произошли. Если я не могу это объяснить, я не могу точно исправить это. Угадайка никогда не бывает удовлетворительной.
Приложение является простым, состоящим из библиотеки классов и приложения форм Windows.
-
Библиотека библиотеки классов С#, предоставляющая базовые функции, инкапсулирующие доступ к базе данных. Эта DLL ссылается на следующие компоненты:
- Система
- System.Core
- System.Core.Datali >
- System.Datali >
- System.Data.DataSetExtensions
- System.Data.OracleClient
- System.Drawing
- System.Windows.Forms
- System.Xml
- System.Xml.Linq
-
Приложение С# Windows Forms, предоставляющее интерфейс. Это приложение ссылается на следующие компоненты:
- CleanCode
- CleanCodeControls (оба из них поддерживают поддержку синтаксиса и локально построены против .NET 3.5).
- LinqBridge
- Roswell.Framework(библиотека классов выше)
- Система
- System.Core
- System.Datali >
- System.Data.DataSetExtensions
- System.Data.OracleClient
- System.Deployment
- System.Design
- System.Drawing
- System.Windows.Forms
- System.Xml
- System.Xml.Linq
Сообщите мне, если вам нужна дополнительная информация, и я с радостью предоставит ее.
Ответы
Ответ 1
LINQBridge сразу вызывает подозрение. Цель этого заключается в предоставлении атрибутов/методов расширения и т.д. Для пользователей 2.0. Если у вас есть 3.5 (System.Core.dll), не используйте LINQBridge. Если вам понадобится LINQBridge в 3.5 для какой-то неясной причины (и я не могу думать об этом), тогда вам, возможно, придется использовать псевдоним extern. Но я действительно сомневаюсь, что вам это нужно!
Ответ 2
Еще один простой способ проверить:
В вашем коде временно используйте класс.
Пример:
System.Runtime.CompilerServices.ExtensionAttribute x = null;
При построении это приведет к ошибке:
Тип 'System.Runtime.CompilerServices.ExtensionAttribute' существует в обоих случаях: c:\Program Files\Reference Ассембли \Microsoft\Framework\v3.5\System.Core.dll 'и.....
И немедленно покажите вам 2 источника, вызывающие конфликт.
Ответ 3
Марк почти правдоподобен. Здесь можно проверить
- Открыть Reflector.exe
- Добавить все несистемные сборки
- F3 и найдите ExtensionAttribute
Если он появляется куда угодно, кроме System.Core, тогда вы знаете, откуда он.
Ответ 4
Другим решением этой проблемы является использование глобального псевдонима для всей сборки:
Ссылка → Свойства → Псевдонимы → Заменить 'global' на что-то еще
Ответ 5
FYI: У меня была такая же проблема, и я смог ее решить, используя команду Resharper "Оптимизировать ссылки", а затем удалив все неиспользуемые ссылки. Не совсем уверен, почему это сработало, но это произошло.
Ответ 6
Другое решение для этой проблемы = > Проект правой кнопки мыши → Свойства → Сборка → Обработка предупреждений как ошибок → Нет