Подделки сломаны в 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 ответ
Если вы работаете с Visual Studio 2015, Enterprize.kindly удалите Old Xrm dll и добавьте новый CRM 2016 SDK Xrm Dll. Создайте проект и измените.Net Framework на последний.
После сборки проекта Generate System Fakes Assembly мы получим mscorlib и system.Fakes просто удалите эту строку
<Add FullName="ConcurrentDictionary"/>
на обоих файлах и построить проект