Предупреждение компилятора C # 1685
-
03-07-2019 - |
Вопрос
Итак, (казалось бы) как гром среди ясного неба, мой проект начинает получать предупреждение компилятора 1685:
Предопределенный тип 'System.Runtime.CompilerServices.ExtensionAttribute' определен в нескольких сборках в глобальном псевдониме;используя определение из "c:\Program Файлы \Ссылка Assemblies\Microsoft\Framework\v3.5\System.Core.dll"
Озадаченный, я изучил статью MSDN, чтобы выяснить ее причину.Вот информация, которую я нашел:
Визуальный справочник по C #:Ошибки и Предупреждения Предупреждение компилятора (уровень 1) CS1685
Сообщение об ошибке Предопределенного типа 'System.type name' определен в нескольких сборках в глобальном псевдониме;используя определение из "Имени файла "
Эта ошибка возникает, когда в двух сборках обнаружен заранее определенный тип системы, такой как System.int32 .Один из способов, которым это может произойти, - это если вы ссылаетесь на mscorlib из двух разных мест, например, пытаетесь запустить the.Net Фреймворки версий 1.0 и 1.1 параллельно.
Компилятор будет использовать определение только из одной из сборок. Компилятор выполняет поиск только по глобальным псевдонимам, не выполняет поиск по библиотекам, определенным /reference.Если вы указали /nostdlib, компилятор будет искать Object, а в дальнейшем начнет все поиски предопределенных типов в файле, где он нашел Object.
Теперь я действительно чешу в затылке.
Я не использую две разные версии .NET Framework (если не считать 2.0 и 3.5).
Я не ссылаюсь на какие-либо странные сборки, которые могли бы вызвать у меня подозрения.
Я не помню, чтобы вносил какие-либо изменения в свое приложение, которые стимулировали бы это изменение.
Я проверил, что все компоненты нацелены на .NET Framework версии v2.0.50727.
Я открыт для предложений или идей о том, как это исправить.Я отношусь к предупреждениям как к ошибкам, и это сводит меня с ума.
Что меня действительно беспокоит в этом, так это то, что я не знаю почему это происходит.Происходящие вещи должны иметь видимую причину, и я должен знать, почему они произошли.Если я не могу это объяснить, я не могу точно это исправить.Догадки никогда не приносят удовлетворения.
Приложение простое, состоящее из библиотеки классов и приложения Windows forms.
Библиотека DLL класса C #, предоставляющая базовую функциональность, инкапсулирующую доступ к базе данных.Эта библиотека DLL ссылается на следующие компоненты:
- Система
- Система.Ядро
- Система.Ядро.Данные
- Система.Данные
- Расширения System.Data.DataSet
- Система.Данные.Клиент OracleClient
- Система.Рисование
- Система.Windows.Формы
- System.Xml
- System.Xml.Linq
Приложение C # Windows Forms, предоставляющее пользовательский интерфейс.Это приложение ссылается на следующие компоненты:
- Чистый код
- CleanCodeControls (оба они обеспечивают поддержку синтаксического редактора и локально встроены в .NET 3.5).
- LINQBridge - Линкбридж
- Roswell.Фреймворк (библиотека классов выше)
- Система
- Система.Ядро
- Система.Данные
- Расширения System.Data.DataSet
- Система.Данные.Клиент OracleClient
- Система.Развертывание
- Система.Дизайн
- Система.Рисование
- Система.Windows.Формы
- System.Xml
- System.Xml.Linq
Дайте мне знать, если вам понадобится дополнительная информация, и я с радостью ее предоставлю.
Решение
LINQBridge сразу вызывает у меня подозрения.Вся цель этого состоит в том, чтобы предоставить атрибут расширения / методы и т.д. для пользователей 2.0.Если у вас есть 3.5 (System.Core.dll), не используйте LINQBridge.Если вы делай нужен LINQBridge в 3.5 по какой-то неясной причине (и я не могу придумать ни одной), тогда вам, возможно, придется использовать внешний псевдоним.Но я в самом деле сомневаюсь, что вам это нужно!
Другие советы
Еще один простой способ проверки:В вашем коде временно используйте этот класс где-нибудь.Пример:
System.Runtime.CompilerServices.ExtensionAttribute x = null;
При сборке это приведет к возникновению ошибки:
Тип 'System.Runtime.CompilerServices.ExtensionAttribute' существует как в 'c:\Program Files eference Assemblies\Microsoft\Framework\v3.5\System.Core.dll', так и .....
И сразу же покажу вам 2 источника, вызвавших конфликт.
Марк почти наверняка прав.Вот способ проверить
- Открыть Reflector.exe
- Добавьте все несистемные сборки
- Нажимаем F3 и ищем атрибут ExtensionAttribute
Если он появляется где-либо, кроме System.Core, тогда вы знаете, откуда он исходит.
Другим решением этой проблемы является использование глобального псевдонима для всей сборки:
Ссылка -> Свойства -> Псевдонимы -> Заменить "глобальный" на что-то другое
К ТВОЕМУ сведению:У меня была такая же проблема, и я смог решить ее, используя команду Resharper "Оптимизировать ссылки", а затем удалив все неиспользуемые ссылки.Не совсем уверен почему это сработало, но так оно и было.
Другое решение этой проблемы => Щелкните правой кнопкой мыши проект -> Свойства -> Сборка -> Обрабатывать предупреждения как ошибки -> Нет