Проект C #, компилятор жалуется на отсутствие ссылки на log4net - PullRequest
2 голосов
/ 13 марта 2019

Я использую Visual Studio 2017 для создания большого проекта на C # (более 200 проектов в решении).При компиляции одного из проектов я получил много ошибок, как показано ниже:

error CS0012: The type 'BufferingAppenderSkeleton' is defined in an assembly that is not referenced. You must add a reference to assembly 'log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=1b44e1d426115821'.

Данный проект, однако, ссылается на log4net 1.2.11.Единственное подозрительное - это net40-full , найденный в пути пакета log4net: " C: \ XXXX \ Src \ packages \ log4net.1.2.11 \ lib \ net40-full \ log4net.dll"

в файле package.config проекта, он содержит следующую строку:

<package id="log4net" version="1.2.11" targetFramework="net461" />

и в своем файле app.config содержит следующую строку:

      <dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-1.2.11.0" newVersion="1.2.11.0"/>
  </dependentAssembly>

Интересно, не является ли несоответствие версии .net (4.0 против 4.61) причиной ошибки компиляции?

C # не является моей основной областью деятельности, но я понимаю, что nuget просматривает эти файлы конфигурации для загрузки необходимых пакетов, в данном случае log4net.Тогда как получилось загрузить версию 4.0, а не версию 4.6.1?

1 Ответ

0 голосов
/ 13 марта 2019

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

Задача NuGet - просто загружать пакеты и извлекать все, что в них есть, по крайней мере, в сценарии восстановления проекта package.config.Атрибут targetFramework в файле packages.config записывается только, никогда не читается клиентом nuget .Я понятия не имею, какова была его цель или намерение.В любом случае, я считаю, что значение targetFramework - это всего лишь .NET Framework, который использовался вашим проектом при установке пакета.

Тогда как получилось, что он скачал версию 4.0, а не 4.6.1?

Справочная информация, перейдите к следующему абзацу, если вам действительно все равно.Если вы перейдете на страницу пакета на nuget.org, вы увидите в истории версий, что 1.2.11 не отображается.Однако, если вы посмотрите на URL-адреса других версий, вы можете угадать URL-адрес для версии 1.2.11 .Быстрый не по теме комментарий, Фабио М был близок, но не совсем правильно сказал, что пакет больше не существует.« nuget.org не поддерживает постоянное удаление пакетов. Это может привести к поломке каждого проекта в зависимости от доступности пакета, особенно с рабочими процессами сборки, которые включают восстановление пакета. ».На странице версии пакета появляется сообщение «Владелец удалил этот пакет из списка. Это может означать, что пакет устарел или больше не должен использоваться».

Вернемся к моей точке, как только выпо этому URL измените n на f в nuget.org, чтобы увидеть версию пакета на fuget.org .Рядом с фреймворками вы можете увидеть список фреймворков, которые поддерживает пакет.net40 - это самая высокая версия, поддерживаемая пакетом.

Итак, причина, по которой NuGet «скачал версию 4.0», заключается в том, что это самая близкая версия, которую предоставляет пакет nuget, совместимый с вашим проектом.Обычно считается, что .NET совместим с прямой совместимостью, поэтому двоичные файлы net45 работают в среде выполнения net462, поэтому обычно нормально использовать двоичные файлы net45, когда ваш проект использует более новую версию.

Наконец, об ошибке, которую выКак я уже говорил в моем первом абзаце, в проектах packages.config задача nuget - просто загрузить и извлечь пакет.Во время установки он добавляет некоторую информацию в csproj, так что компилятор может попытаться найти dll.Итак, если вы посмотрите на свой csproj, вы должны найти ссылку на log4net.dll, и она будет содержать путь подсказки, который использует компилятор.Если этот путь подсказки неверен, вы увидите ошибки, которые видите.Это чаще всего происходит, когда проекты перемещаются в структуру каталогов, но не переустанавливают пакет.Например, если структура репо изначально была «project \ project.csproj» и она была изменена на «src \ project \ project.csproj», тогда путь подсказки «.. \ packages \ log4net.1.2.11 \ lib \ net45 \»log4net.dll "неверно, потому что необходимо добавить дополнительную" .. \ ", чтобы относительный путь к папке пакетов был правильным.Могут быть и другие причины, по которым путь подсказки неверен, но это самая распространенная причина.

...