Проекты с одинаковым пакетом nuget, ссылающиеся на разные версии сборки - PullRequest
0 голосов
/ 07 марта 2019

Я схожу с ума здесь, и я надеюсь, что это то, что я просто упустил.

Я испытываю периодические FileLoadExceptions, которые появляются после развертываний, даже если код изменяется между развертываниями не изменяет никаких ссылок на сборки .

Глядя на самый последний пример этого, я вижу FileLoadException из-за System.IO.Compression, версия 4.2.0.0 не найдена.

Во всех случаях мы ссылаемся на пакет System.IO.Compression nuget, версия 4.3.0.

Глядя на два проекта в нашем решении, я заметил нечто очень странное.
ProjectA ссылки ProjectB.

ProjectA имеет в своем файле packages.config следующую ссылку:

<package id="System.IO.Compression" version="4.3.0" targetFramework="net462" />

ProjectB имеет в своем файле package.config следующую ссылку:

<package id="System.IO.Compression" version="4.3.0" targetFramework="net462" />

Когда я просматриваю файлы *.csproj, я вижу это:

ProjectA:

<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  <HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
</Reference>`

ProjectB:

<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  <HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
</Reference>`

Отлично, мы указываем на одну и ту же сборку на диске в обоих случаях.

Тем не менее, когда я смотрю на ссылкуd файл в обозревателе решений, я вижу это:

ProjectA:

Reference to some other System.IO.Compression assembly

Выше ссылка на файл, который находится вC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.IO.Compression.dll и, что более важно, имеет версию 4.2.0.0, а не версию, которая находится в папке пакетов nuget.

ProjectB:

Reference to the correct System.IO.Compression assembly

Вышеприведенное правильно указывает на версию сборки пакетов nuget, которая на самом деле 4.1.2.0.

Повторяю, ProjectA, которая ссылается на ProjectB, и оба имеютПереадресация привязки, которая выполняет следующие действия:

<dependentAssembly>
    <assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>`

Поэтому мой вопрос заключается в том, почему Visual Studio запрашивает версию System.IO.Compression из местоположения, на которое не ссылается (напрямую)любой из наших проектов?И что я могу сделать, чтобы это исправить?

Далее, хотя локально я использую (текущую) RC-версию Visual Studio 2019, наши агенты сборки (конвейеры DevOps Azure) используют Visual Studio 2017.

Во время выполнения мы находим вышеупомянутое исключение, записанное в журнал, и наша обработка, которая создает ZIP-файл, не выполняется.

Обновление

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

Еще осталось понять, как мы попали бы в это состояние,и почему расхождения с тем, на что указывает csproj, с тем, что видно в обозревателе решений.

1 Ответ

1 голос
/ 07 марта 2019

Проекты с одинаковым пакетом nuget, ссылающиеся на другую версию сборки

Это известная проблема при создании приложения .NET Framework 4.6.x.

Это потому что:

Это связано с внедрением поддержки для NETStandard 2.0.Мы добавляем новые сборки в NET 4.6.1 и более поздние настольные проекты, чтобы добавить поддержку netstandard2.0 .Теперь мы делаем это в целях, а не в пакетах, потому что больше нет необходимости ссылаться на пакет для создания нестандартной библиотеки.Это внедрение происходит всякий раз, когда мы видим ссылку на библиотеку netstandard1.5 или выше (см. Dotnet / sdk # 1386).

Чтобы решить эту проблему, мы могли бы добавить перенаправление привязки к этим ссылкам, чтобы использовать стандартные ссылки наSystem.IO.Compression и не приносить никакой пакет Nuget за System.IO.Compression.Если вы все еще хотите использовать ссылку System.IO.Compression из пакета nuget, вы можете удалить System.IO.Compression из инструментария MSBuild.

Проверьте более подробную информацию из Github:

https://github.com/dotnet/corefx/issues/25773

Надеюсь, это поможет.

...