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