Отсутствует зависимость проекта при ссылке на проект

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

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

на ConsoleApplication1 консольное приложение работает, как ожидалось, но при запуске модульных тестов в ConsoleApplication1Test Я получаю это исключение:

система.ИО.FileNotFoundException: не удалось загрузить файл или сборку - Система.Среда выполнения, версия=4.1.1.0, культура=нейтральная, PublicKeyToken=b03f5f7f11d50a3a' или одна из его зависимостей. Этот система не может найти указанный файл.

на . Почему это происходит?

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

2 ответов


решение

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

во-первых, решение. Я заметил, что Consoleapplication 1.файл csproj была линия конфигурации тестового проекта не. Поэтому я добавил:--13-->

<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>

модульный тест теперь терпит неудачу, потому что он не может найти конфиг.формат JSON. Успех!

Edit: после запуска сборки из командной строки ниже модульный тест прошел. Я не уверен, почему 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)

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

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

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

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

  1. загрузите проект по ссылке, указанной в вопросе
  2. добавьте пакет Nunit3testadapter NuGet в тестовый проект (личные предпочтения - ошибка присутствовала при использовании VS Test runner)
  3. запустите тесты, чтобы проверить ошибки
  4. очистить решение
  5. выполнить msbuild /verbosity:diag ReferenceTest.sln > build.txt из командной строки разработчика в папке решения
  6. измените тестовый проект, как описано выше
  7. выполнить msbuild /verbosity:diag ReferenceTest.sln > build2.txt
  8. выполнить devenv /diff build.txt build2.txt или ваш любимый инструмент сравнения

кажется, что Newtonsoft.Библиотека Json, на которую вы ссылаетесь из Common, ссылается сама на систему.Среда выполнения ver 4.0 Но весь ваш проект ориентирован на 4 + framework. В этом суть конфликта.

попробуйте обновить или переустановить пакет NuGet с Newtonsoft.Библиотека Json или понижение целевой структуры всего проекта до версии 4.0.