Подделки сломаны в Visual Studio 2015

У меня Visual Studio 2015 Enterprise и я обнаружил, что не могу скомпилировать практически ни один из наших существующих проектов 2013 года. Дальнейшие исследования показывают, что Visual Studio 2015 не может генерировать подделки для типов, которые были хороши в Visual Studio 2013.

Рассмотрим следующие шаги для воспроизведения:

  • Создать модульный тестовый проект с таргетингом на.NET 4.5
  • Щелкните правой кнопкой мыши "Система" на вкладке ссылок и выберите "Добавить сборку подделок"
  • Чтобы устранить шум в этом примере, отредактируйте следующий файл "System.fakes":
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="System" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
  </ShimGeneration>  
</Fakes>
  • Затем отредактируйте файл "mscorlib.fakes", чтобы он соответствовал ConcurrentDictionary:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
    <Add FullName="ConcurrentDictionary"/>
  </ShimGeneration>
</Fakes>
  • Скомпилируйте проект.

  • Это генерирует следующие сообщения об ошибках в файле mscorlib.4.0.0.0.Fakes.messages (генерируется в папке FakesAssemblies):

предупреждение: ошибка компиляции, повторная попытка без контрактов кода

И следующие сообщения об ошибках в окне вывода:

c:\ temp\UnitTestProject1\UnitTestProject1\ f.cs (955,13): ошибка CS0311: тип "System.Collections.Concurrent.ConcurrentDictionary" нельзя использовать в качестве параметра типа "TShimmed" в универсальном типе или методе "ShimRuntime".Bind(TShim, TBound) ". Не существует неявного преобразования ссылок из 'System.Collections.Concurrent.ConcurrentDictionary' в 'System.Collections.Generic.IReadOnlyCollection>'. [C:\ Temp\UnitTestProject1\UnitTestProject1\ OBJ \Debug\ Подделки \ м \ f.csproj]

c:\ temp\UnitTestProject1\UnitTestProject1\ f.cs (979,13): ошибка CS0311: тип "System.Collections.Concurrent.ConcurrentDictionary" нельзя использовать в качестве параметра типа "TShimmed" в универсальном типе или методе "ShimRuntime".Bind(TShim, TBound) ". Не существует неявного преобразования ссылок из 'System.Collections.Concurrent.ConcurrentDictionary' в 'System.Collections.Generic.IReadOnlyDictionary'. [C:\ Temp\UnitTestProject1\UnitTestProject1\ OBJ \Debug\ Подделки \ м \ f.csproj]

GENERATEFAKES: ошибка: сбой компиляции проекта с кодом выхода 1

Похоже, никакие изменения в настройках mscorlib.fakes не помогут. Например, различные перестановки атрибутов TypeName, FullName и Namespace дают одно и то же "компиляция не удалась с кодом выхода 1".

Отключение контрактов кода просто нарушает его:

Предупреждение Элемент "Подделки" в пространстве имен " http://schemas.microsoft.com/fakes/2011/" имеет недопустимый дочерний элемент "StubGeneration" в пространстве имен " http://schemas.microsoft.com/fakes/2011/". UnitTestProject1 c:\temp\UnitTestProject1\UnitTestProject1\Fakes\mscorlib.fakes 4

Любая помощь в понимании того, как исправить / обойти эту проблему, будет очень признательна.

1 ответ

  1. Если вы работаете с Visual Studio 2015, Enterprize.kindly удалите Old Xrm dll и добавьте новый CRM 2016 SDK Xrm Dll. Создайте проект и измените.Net Framework на последний.

  2. После сборки проекта Generate System Fakes Assembly мы получим mscorlib и system.Fakes просто удалите эту строку <Add FullName="ConcurrentDictionary"/>на обоих файлах и построить проект

Другие вопросы по тегам