Вопрос

Итак, (казалось бы) как гром среди ясного неба, мой проект начинает получать предупреждение компилятора 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.

Теперь я действительно чешу в затылке.

  1. Я не использую две разные версии .NET Framework (если не считать 2.0 и 3.5).

  2. Я не ссылаюсь на какие-либо странные сборки, которые могли бы вызвать у меня подозрения.

  3. Я не помню, чтобы вносил какие-либо изменения в свое приложение, которые стимулировали бы это изменение.

  4. Я проверил, что все компоненты нацелены на .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 источника, вызвавших конфликт.

Марк почти наверняка прав.Вот способ проверить

  1. Открыть Reflector.exe
  2. Добавьте все несистемные сборки
  3. Нажимаем F3 и ищем атрибут ExtensionAttribute

Если он появляется где-либо, кроме System.Core, тогда вы знаете, откуда он исходит.

Другим решением этой проблемы является использование глобального псевдонима для всей сборки:

Ссылка -> Свойства -> Псевдонимы -> Заменить "глобальный" на что-то другое

К ТВОЕМУ сведению:У меня была такая же проблема, и я смог решить ее, используя команду Resharper "Оптимизировать ссылки", а затем удалив все неиспользуемые ссылки.Не совсем уверен почему это сработало, но так оно и было.

Другое решение этой проблемы => Щелкните правой кнопкой мыши проект -> Свойства -> Сборка -> Обрабатывать предупреждения как ошибки -> Нет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top