Подтвердить что ты не робот

Использование Microsoft.Bcl.Async с анализом кода вызывает ошибки

Я пытаюсь использовать Microsoft.Bcl.Async и Code Analysis, но когда я запускаю Code Analysis, я получаю одну или несколько ошибок.

Я использую Visual Studio 2012 с Update 2.

Это легко для меня воспроизвести:

  • Создайте новое консольное приложение по умолчанию, которое предназначено для .Net 4.
  • Щелкните правой кнопкой мыши References, затем выберите Manage NuGet Packages...
  • Нажмите Online и введите async в поле Search Online.
  • Вы должны увидеть Async for .Net Framework 4 .... Нажмите Install и примите все вопросы.
  • Добавьте в Main() строку, которая говорит: TaskEx.Delay(1000); и using System.Threading.Tasks;
  • Перейдите к свойствам проекта, разделу Анализ кода и нажмите Enable Code Analysis on Build.
  • Скомпилируйте программу.

Я получаю две ошибки анализа кода:

CA0052 Ошибка анализа кода выполнения CA0052: Цели не выбраны. [Ошибки и предупреждения] (глобальные)

CA0055 Ошибка анализа кода выполнения CA0055: Не удалось загрузить ConsoleApplication2.exe. При чтении модуля "ConsoleApplication2" возникла следующая ошибка: Не удалось разрешить ссылку на элемент: [Microsoft.Threading.Tasks, Version = 1.0.12.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a] System.Threading.Tasks.TaskEx:: Delay. [Ошибки и предупреждения] (глобальные)

Я получаю разные ошибки анализа кода для других тестовых программ. Основное приложение Windows Forms, которое я попробовал, дает мне:

CA0001 Ошибка анализа кода выполнения CA0001: при чтении модуля "AsyncForNet4" возникла следующая ошибка: не удалось разрешить ссылку на элемент: [Microsoft.Threading.Tasks, Version = 1.0.12.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a] System.Threading.Tasks.TaskEx:: Delay. [Ошибки и предупреждения] (глобальные)

Два вопроса:

  • Может ли кто-нибудь еще воспроизвести эту проблему?
  • Есть ли у кого-нибудь решение для этого?
4b9b3361

Ответ 1

Как упоминалось Николь, это происходит потому, что Code Analysis/FxCop обеспечивает сильные имена, включая версии, точно совпадают. Такое поведение имеет смысл для .NET Framework, пока вы не начнете учитывать переадресацию привязки (или другие платформы, такие как Store, Phone и Silverlight, которые всегда позволяют более поздним версиям сборки соответствовать более ранней версии), что FxCop не уважает.

Я написал это оригинальное поведение в FxCop, и это было над оптимизацией для корректности и реального мира. В то время у нас не было отказа, кроме как через App.Config. Однако, к счастью, после того, как я покинул команду, какой-то умный человек в команде добавил один из них через командную строку и в Visual Studio.

Через командную строку:

FxCopCmd.exe /assemblycomparemode:StrongNameIgnoringVersion ...

Через Visual Studio:

  • Щелкните правой кнопкой мыши проект в Обозреватель решений и выберите Выгрузить
  • Щелкните правой кнопкой мыши проект в обозревателе решений и выберите Изменить
  • Внутри первого элемента <PropertyGroup> добавьте следующее: <CodeAnalysisAdditionalOptions> /assemblycomparemode:StrongNameIgnoringVersion</CodeAnalysisAdditionalOptions>
  • Щелкните правой кнопкой мыши проект в Обозреватель решений, выберите Обновить, чтобы сохранить изменения при появлении запроса.

Это будет работать только в Visual Studio 2012 и выше.

Ответ 2

Это происходит потому, что версии зависимостей, объявленных в сборках Bcl.Async, не соответствуют тем, которые доступны во время анализа. Простейшим обходным решением является настройка FxCop AssemblyReferenceResolveMode, как описано в http://davesbox.com/archive/2008/06/14/reference-resolutions-changes-in-code-analysis-and-fxcop-part-2.aspx.

Ответ 3

Иметь такую ​​же проблему, и искать решение. Единственное упоминание, которое я нашел, - это комментарии к сообщению в блоге bcl - Microsoft.Bcl.Async теперь стабильно (страница 3 комментариев) где Ответ Immo Landwerth на кого-то, у кого есть такая же проблема,

Мы изучаем это. На первый взгляд это похоже на проблему унификации в функции анализа статического кода VS (FxCop). Мы связались с владельцами. К сожалению, я не думаю, что есть обходной путь, отличный от отключения анализа кода для этих проектов: - (

Ответ от 26 апреля 2013 года, были ли какие-либо события с тех пор.

Итак, теперь я предполагаю, что обходные пути:

  • Отключить анализ кода
  • Перепишите свой код, чтобы не использовать TaskEx.Delay()