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

Отсутствие зависимости проекта при обращении к проекту

Я сталкиваюсь с некоторыми проблемами с зависимостями при обращении к проектам в Visual Studio. Вот как структурировано мое решение ReferenceTest:

  • Обычный. Библиотека классов, содержащая статический метод CommonClass.HelloWorld(), возвращающий строку. Строка, возвращаемая этим методом, считывается из конфигурационного файла JSON с использованием Microsoft.Extensions.Configuration(и большого набора его зависимостей), установленного с помощью NuGet.
  • ConsoleApplication1. Консольное приложение, записывающее строку CommonClass.HelloWorld() в консоль с использованием статического метода Worker.DoWork(). Это консольное приложение имеет ссылку на проект для общего проекта.
  • ConsoleApplication1Test. Библиотека классов, использующая NUnit для тестирования того, что метод Worker.DoWork() из ConsoleApplication1 возвращает ожидаемую строку. Эта библиотека классов имеет ссылку на проект проекта ConsoleApplication1.

Консольное приложение ConsoleApplication1 работает так, как ожидалось, но при запуске unit test в ConsoleApplication1Test я получаю это исключение:

System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'System.Runtime, Version = 4.1.1.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'или одна из его зависимостей. система не может найти указанный файл.

Файл System.Runtime.dll(и, возможно, другие) не копируется в папку bin при компиляции проекта ConsoleApplication1Test. Почему это происходит?

Zip файл с демо-решением можно найти здесь: http://www.filedropper.com/referencetest

4b9b3361

Ответ 1

Решение

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

Во-первых, решение. Я заметил, что в файле ConsoleApplication1.csproj была строка конфигурации, которую не выполнял тестовый проект. Итак, я добавил:

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

в файл проекта тестирования. Первый раздел <PropertyGroup> теперь выглядит следующим образом:

<PropertyGroup>
  <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
  <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
  <ProjectGuid>{A97E82A2-2EF9-43AB-A46B-882131BAF1D0}</ProjectGuid>
  <OutputType>Library</OutputType>
  <AppDesignerFolder>Properties</AppDesignerFolder>
  <RootNamespace>ConsoleApplication1Test</RootNamespace>
  <AssemblyName>ConsoleApplication1Test</AssemblyName>
  <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
  <FileAlignment>512</FileAlignment>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>

unit test теперь терпит неудачу, потому что он не может найти config.json. Успех!

Изменить: после запуска сборки из командной строки, приведенной ниже, прошло unit test. Я не уверен, почему config.json не присутствовал при создании из Visual Studio.

Частичное пояснение

Это свойство AutoGenerateBindingRedirects похоже на то, как процесс сборки разрешает ссылки на библиотеки, которые являются частью .NET Framework. Например, сравнение до и после подробного вывода журнала показывает, что:

Unified Dependency "System.Runtime, Version=4.0.20.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". (TaskId:97)
    Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Configuration.Abstractions.dll" because there is a more recent version of this framework file. (TaskId:97)
    Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Configuration.dll" because there is a more recent version of this framework file. (TaskId:97)
    Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Configuration.Binder.dll" because there is a more recent version of this framework file. (TaskId:97)
    Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Primitives.dll" because there is a more recent version of this framework file. (TaskId:97)
    Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.FileProviders.Abstractions.dll" because there is a more recent version of this framework file. (TaskId:97)
    Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\System.Runtime.CompilerServices.Unsafe.dll" because there is a more recent version of this framework file. (TaskId:97)
    Resolved file path is "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7\Facades\System.Runtime.dll". (TaskId:97)
    Reference found at search path location "{TargetFrameworkDirectory}". (TaskId:97)

Изменения:

Unified Dependency "System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". (TaskId:97)
  Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Configuration.Abstractions.dll" because AutoUnify is 'true'. (TaskId:97)
  Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Configuration.dll" because AutoUnify is 'true'. (TaskId:97)
  Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Configuration.Binder.dll" because AutoUnify is 'true'. (TaskId:97)
  Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.Primitives.dll" because AutoUnify is 'true'. (TaskId:97)
  Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\Microsoft.Extensions.FileProviders.Abstractions.dll" because AutoUnify is 'true'. (TaskId:97)
  Using this version instead of original version "4.0.0.0" in "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\System.Runtime.CompilerServices.Unsafe.dll" because AutoUnify is 'true'. (TaskId:97)
  Resolved file path is "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug\System.Runtime.dll". (TaskId:97)
  Reference found at search path location "C:\Users\User\Desktop\ReferenceTest\ConsoleApplication1\bin\Debug". (TaskId:97)

Я бы себе представить, что узел привязки редиректа в файле app.config влияет на некоторые аспекты разрешения опорной сборки пути в процессе сборки. Это подтверждается появлением этого вывода сборки, только после добавления указанного свойства:

Added Item(s): 
    _ResolveAssemblyReferencesApplicationConfigFileForExes=
        app.config
                OriginalItemSpec=app.config
                TargetPath=ConsoleApplication1Test.dll.config

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

Для справки, чтобы произвести вышеописанные сравнения сборки, я сделал следующее:

  • Загрузите проект из ссылки, указанной в вопросе
  • Добавьте NUGet пакет NUnit3TestAdapter в проект тестирования (личная настройка - ошибка присутствовала при использовании тестового бегуна VS)
  • Запустите тесты для проверки ошибок
  • Очистите решение
  • Запустите msbuild /verbosity:diag ReferenceTest.sln > build.txt из командной строки разработчика в папке с решением
  • Измените тестовый проект, как описано выше.
  • Запустить msbuild /verbosity:diag ReferenceTest.sln > build2.txt
  • Запустите devenv /diff build.txt build2.txt или ваш любимый инструмент сравнения

Ответ 2

Кажется, что библиотека Newtonsoft.Json, на которую вы ссылаетесь из Common, ссылается на itselft на System.Runtime ver 4.0 Но весь ваш проект нацелен на рамки 4+. Это точка конфликта.

Попробуйте обновить или переустановить пакет NuGet с помощью библиотеки Newtonsoft.Json или понизить целевую структуру всего проекта до версии 4.0.