Предупреждение компилятора C # 1685 - PullRequest
45 голосов
/ 02 марта 2009

Итак, (на первый взгляд) неожиданно мой проект начинает получать предупреждение компилятора 1685:

Предопределенный тип 'System.Runtime.CompilerServices.ExtensionAttribute' определяется в нескольких сборках в глобальный псевдоним; используя определение из 'c: \ Program Files \ Reference Сборки \ Microsoft \ Framework \ v3.5 \ System.Core.dll '

Озадаченный, я исследовал статью MSDN, чтобы выяснить ее причину. Вот информация, которую я нашел:

Справочник по Visual C #: ошибки и Предупреждение компилятора предупреждений (уровень 1) CS1685

Сообщение об ошибке Предопределенный тип «Имя System.type» определено в несколько сборок в глобальном псевдоним; используя определение из файла Имя '

Эта ошибка возникает, когда предопределенный Тип системы, такой как System.int32, найдено в двух сборках. Один способ это может произойти, если вы ссылаетесь mscorlib из двух разных мест, например, пытаясь запустить .Net Framework версии 1.0 и 1.1 бок о бок.

Компилятор будет использовать определение только из одной сборки. компилятор ищет только глобальные псевдонимы, не ищет определенные библиотеки /ссылка. Если вы указали / nostdlib, компилятор будет искать для объекта, и в будущем начать все поиски предопределенных типов в файл, в котором он нашел объект.

Теперь я действительно чешу голову.

  1. Я не работаю два разных версии .NET Framework (если не считать 2,0 и 3,5).

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

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

  4. Я проверил, что все компоненты предназначены для .NET Framework версии 2.0.050727.

Я открыт для предложений или идей, как это исправить. Я воспринимаю предупреждения как ошибки, и это сводит меня с ума.

Что меня действительно беспокоит, так это то, что я не знаю почему это происходит. Вещи, которые случаются, должны иметь видимую причину, и я должен знать, почему они произошли. Если я не могу объяснить это, я не могу точно исправить это. Угадайка никогда не бывает удовлетворительной.

Приложение простое, состоит из библиотеки классов и приложения Windows Forms.

  • Библиотека DLL класса C #, обеспечивающая базовую функциональность инкапсуляции доступа к базе данных. Эта DLL ссылается на следующие компоненты:

    • System
    • System.Core
    • System.Core.Data
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Drawing
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq
  • Приложение C # для Windows Forms, предоставляющее пользовательский интерфейс. Это приложение ссылается на следующие компоненты:

    • CleanCode
    • CleanCodeControls (оба из них предоставляют поддержку редактора синтаксиса и локально созданы для .NET 3.5).
    • LinqBridge
    • Roswell.Framework (библиотека классов выше)
    • System
    • System.Core
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Deployment
    • System.Design
    • System.Drawing
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq

Дайте мне знать, если вам нужна дополнительная информация, и я с удовольствием предоставлю ее.

Ответы [ 6 ]

96 голосов
/ 29 июня 2011

Еще один простой способ проверить: В вашем коде временно используйте класс где-нибудь. Пример:

System.Runtime.CompilerServices.ExtensionAttribute x = null;

При сборке выдается ошибка:

Тип 'System.Runtime.CompilerServices.ExtensionAttribute' существует в обоих 'c: \ Program Files \ Reference Сборки \ Microsoft \ Framework \ v3.5 \ System.Core.dll 'и .....

И сразу же покажу вам 2 источника, вызвавших конфликт.

22 голосов
/ 02 марта 2009

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

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

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

22 голосов
/ 02 марта 2009

LINQBridge сразу вызывает у меня подозрения. Цель всего этого - предоставить атрибуты расширения / методы и т. Д. Для пользователей 2.0. Если у вас 3.5 (System.Core.dll), не используйте LINQBridge. Если вам действительно нужен LINQBridge в версии 3.5 по какой-то непонятной причине (и я не могу придумать одну), то вам, возможно, придется использовать внешний псевдоним. Но я действительно сомневаюсь, что вам это нужно!

9 голосов
/ 09 ноября 2010

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

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

5 голосов
/ 03 мая 2012

К вашему сведению: у меня была та же проблема, и я смог ее решить, используя команду «Оптимизировать ссылки» Решарпера, а затем удалил все неиспользуемые ссылки. Не совсем уверен , почему это сработало, но это сработало.

0 голосов
/ 08 января 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...