2016-02-06 2 views
8

При запуске модульных тестов вызов любого метода в моей библиотеке DLL со стандартной библиотекой времени выполнения, которая ссылается на «System.Reflection.TypeExtensions», генерирует исключение FileNotFound, поиск «System .Reflection.TypeExtensions». Ошибка не возникает, когда один и тот же код выполняется в универсальном приложении Windows 10.Невозможно загрузить сборку при ссылке на тип BindingFlags в Windows 10 Универсальная библиотека Windows

Проект представляет собой портативную среду исполнения C#, настроенную для поддержки .net Framework 4.6 и Windows Universal 10.0. Проект тестирования настроен на использование .net Framework 4.6.

Всякий раз, когда я пытаюсь вызвать метод, который использует тип System.Reflection.BindingFlags, я получаю следующее исключение. Исключение возникает при запуске вызова (предположительно, когда выполняется функция).

Test method Sfx.Test.SignalExpressionTest.TestAddExpressions threw exception: 
System.IO.FileNotFoundException: Could not load file or assembly 'System.Reflection.TypeExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.=== Pre-bind state information === 
LOG: DisplayName = System.Reflection.TypeExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
(Fully-specified) 
+4

Я вижу это, уродливая ошибка. Трудно диагностировать.Зависимости NETCore невозможно распутать. Обходной путь заключается в добавлении пакета Nuget в ваш проект. –

+0

Я нашел это также (проблема с модулем тестирования: я также выполняю модульный тест): https://social.msdn.microsoft.com/Forums/windowshardware/en-US/37f248bb-c45c-4b17-ae45-45913e7ce4b8/portable -class-library-fail-to-jit-when-referencing-systemreflectionbindingflags-when-running? forum = vsunittest – eschneider

+0

Это, конечно, такая же проблема. Мне непонятно, почему вы не хотите добавлять пакет Nuget. Похоже, что это получило borken 15 января, совершив от mellinoe, который переместил BindingFlags. Просто сообщите об ошибке, нажмите кнопку «Новая проблема» на [этой веб-странице] (https://github.com/dotnet/corefx/issues), чтобы сообщить ему об этом. Имейте в виду, что такие ошибки довольно нормальные, CoreFx движется быстро и едва тестируется. Вы пионер со стрелами в спине. –

ответ

2

Добавление этих пакетов является то, что нужно делать. Вот почему вы видите это поведение:

  1. BindingFlags в настоящее время [1] подвергается в System.Reflection.TypeExtensions.
  2. Когда вы компилируете библиотеку классов .NET Core, компилятор записывает ссылку на тип как System.Reflection.TypeExtensions!System.Reflection.BindingFlags.
  3. Когда вы используете библиотеку классов из приложения .NET Framework, вам нужно добавить ссылку на System.Reflection.TypeExtensions, иначе компилятор не сможет решить этот тип. То же самое верно для проекта модульного тестирования, который должен развернуть весь код для запуска.
  4. Во время выполнения CLR будет разрешать тип, найти тип вперед, который указывает на mscorlib!System.Reflection.BindingFlags и с радостью запустить ваш код.

Как правило, .NET Core предназначен для развертывания фреймворка в локальном приложении, другими словами, когда ваше приложение развертывается в папке, закрытие всех ваших зависимостей необходимо также развертываться. Хотя проекты модульных тестов являются концептуально библиотеками классов, то же самое происходит, потому что они выполняются как приложения.

Конечно, мы не ожидаем, что люди будут вручную настраивать ссылки и искать зависимости. То, что вы видите в данный момент, - это дореволюционные биты, в которых не все части опыта нашего инструментария делают правильные вещи.

Два вопроса с моей стороны:

  1. Какие рамки модульного тестирования вы используете? Я предполагаю, что это MSTest (Microsoft.VisualStudio.TestTools.UnitTesting), в отличие от xUnit или NUnit?

  2. Какой бегун вы используете? Я предполагаю, что это встроенный тестовый проводник Visual Studio (в отличие от ReSharper или TestDriven.NET)?


[1] Я говорю, потому что в настоящее время на основе обратной связи с клиентами мы decided, чтобы переместить его обратно в System.Reflection, вместе с API, которые принимают BindingFlags.

+0

Да, я выполняю все свои модульные тесты с помощью модульного тестирования Visual Studio, никаких третьих сторон. – eschneider

+0

Спасибо. Я убеждаюсь, что это сработает для выпуска VS. –

+1

Моя библиотека нацелена на .NET Standard 1.4, а вызывающая программа - это полное приложение с каркасом 4.6.1. Никаких «бит до релиза» не задействован, но я все еще сталкивался с этой проблемой. Было бы неплохо видеть, что это действительно исправлено. – HappyNomad

4

добавить ссылку на NuGet пакеты:

System.Reflection 
System.Reflection.Extensions 
System.Reflection.Primitives 
+0

Отстой, что я потерял 100 очков, хотя я ответил на это. Базовая логика испорчена ... – eschneider

+1

Добавьте это, System.Reflection.TypeExtensions, и тогда она будет работать. – CrusherJoe

Смежные вопросы