Binding redirect при импорте AngleSharp в .Net 4.7.2 как-то пытается вытащить NetStandard 2 как dll

У меня есть устаревшее приложение, работающее на старом сервере Windows 2008 R2. Приложение прошло множество версий .Net и в настоящее время находится на версии 4.7.2. Он был стабилен как скала в течение многих лет, и, хотя есть планы по миграции со старого физического сервера, он должен прожить еще некоторое время.

Новая функция видит необходимость в некоторой очистке HTML. Я добавил пакет NuGet для AngleSharp v0.12.0, протестировал модуль, и все было хорошо на моей машине разработки Win10. Новый класс, использующий AngleSharp, просто работал.

Поэтому я развернулся на рабочем сервере, включая изменения в app.config;

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

Это единственные изменения, которые я смог выявить по сравнению со старой версией.

Когда я запускаю приложение в рабочей среде, оно падает.

System.IO.FileLoadException: Could not load file or assembly 'System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

После небольшого поиска в Интернете я увидел, что кто-то указал на похожую проблему (однако, .Net Core, но все же похожую), и они указали, что попытка вызова Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); может иметь значение. Ссылка: https://github.com/DiscUtils/DiscUtils/issues/77

Это не для меня, но теперь я получил более прикольные сообщения:

System.IO.FileNotFoundException: Could not load file or assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.

Как netstandard попал в это? Я не знаю. Я также вижу это в журнале привязки, который я получаю благодаря регистрации исключений Splats:

5496 === Pre-bind state information ===
5497 LOG: DisplayName = netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
5498  (Fully-specified)
5499 LOG: Appbase = file:///E:/dcollect/Ingest/
5500 LOG: Initial PrivatePath = NULL
5501 Calling assembly : System.Text.Encoding.CodePages, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a.
5502 ===
5503 LOG: This bind starts in default load context.
5504 LOG: Using application configuration file: E:\dcollect\Ingest\Ingest.exe.Config
5505 LOG: Using host configuration file:
5506 LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
5507 LOG: Post-policy reference: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
5508 LOG: Attempting download of new URL file:///E:/dcollect/Ingest/netstandard.DLL.
5509 LOG: Attempting download of new URL file:///E:/dcollect/Ingest/netstandard/netstandard.DLL.
5510 LOG: Attempting download of new URL file:///E:/dcollect/Ingest/netstandard.EXE.
5511 LOG: Attempting download of new URL file:///E:/dcollect/Ingest/netstandard/netstandard.EXE.

У меня нет известных (мне) ссылок на Netstandard в моем проекте, все проекты являются проектами .Net Framework 4.5, 4.6.x или 4.7.x.

Я также наткнулся на это, которое, похоже, может быть связано: https://github.com/dotnet/announcements/issues/31

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

Для полноты картины вот журнал привязки моей первой попытки использования AngleSharp.

5576 [20:24:01.522] <ERROR> EventParser: Exception caught: System.IO.FileLoadException: Could not load file or assembly 'System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
5577 File name: 'System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
5578    at AngleSharp.Browser.EncodingMetaHandler..ctor()
5579    at AngleSharp.Configuration..ctor(IEnumerable`1 services)
5580    at AngleSharp.Configuration.get_Default()
5581    at Teller.Charts.DataCollection.EventParser.ParseHTML(String html)
5582 === Pre-bind state information ===
5583 LOG: DisplayName = System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
5584  (Fully-specified)
5585 LOG: Appbase = file:///E:/dcollect/Ingest/
5586 LOG: Initial PrivatePath = NULL
5587 Calling assembly : AngleSharp, Version=0.11.0.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea.
5588 ===
5589 LOG: This bind starts in default load context.
5590 LOG: Using application configuration file: E:\dcollect\Ingest\Ingest.exe.Config
5591 LOG: Using host configuration file:
5592 LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
5593 LOG: Post-policy reference: System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
5594 LOG: Attempting download of new URL file:///E:/dcollect/Ingest/System.Text.Encoding.CodePages.DLL.
5595 WRN: Comparing the assembly name resulted in the mismatch: Minor Version
5596 ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Я уверен, что здесь должна быть какая-то простая магия перенаправления, которую мне не хватает. Можно ли убедить мой проект загрузить это для Net Framework v4.7.2 и просто работать?

Спасибо за любые предложения!

РЕДАКТИРОВАНИЕ 14 МАЯ. Больше всего меня смущает то, что используются разные номера версий.

Пакет NuGet AngleSharp 0.12.0 зависит от System.Text.Encoding.CodePages >= 4.5.0.

Таким образом, он автоматически установил v4.5.0, даже если существует v4.5.1, из-за наименьшего поведения зависимостей.

Если я щелкну правой кнопкой мыши фактическую DLL, которая помещается в мою папку bin\Debug, выберу «Свойства», а затем «Версия», она сообщит о версии файла и продукта 4.6.26515.

Но в моем app.config перенаправление привязки, которое я получаю, относится к 4.1.1.0.

    <dependentAssembly>
      <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
    </dependentAssembly>

(Я попытался заменить оба экземпляра 4.1.1.0 на 4.6.26515.0 просто для удовольствия, но это ничего не изменило)

И затем, как указано выше, журнал утверждает:

29014 [22:42:44.735] <ERROR> EventInfoCreator: Failed to parse: System.IO.FileLoadException: Could not load file or assembly 'System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
29015 File name: 'System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
29016    at AngleSharp.Browser.EncodingMetaHandler..ctor()
29017    at AngleSharp.Configuration..ctor(IEnumerable`1 services)
29018    at AngleSharp.BrowsingContext.New(IConfiguration configuration)
29019    at Teller.Charts.DataCollection.EventParser.ParseHTML(String html)
29020    at Teller.Charts.DataCollection.EventParser.ParseFile(String filePath)
29021    at Teller.Charts.DataCollection.EventInfoCreator.CreateEventInfoProps(String html, String storageDirectory)

Так что здесь, очевидно, какое-то несоответствие версий, но я, честно говоря, понятия не имею, какие из этих номеров версий важны.

29034 LOG: Attempting download of new URL file:///E:/dcollect/Ingest/System.Text.Encoding.CodePages.DLL.
29035 WRN: Comparing the assembly name resulted in the mismatch: Minor Version

Кажется, это указывает на то, что он недоволен минорной версией, но... какой именно?

4.0.2.0, который, кажется, просит AngleSharp? 4.1.1.0, на который ссылается app.config? 4.6.26515.0 - это версия, за которую на самом деле претендует dll?


person Rune Jacobsen    schedule 12.05.2019    source источник


Ответы (2)


Моя команда столкнулась с различными проблемами перенаправления привязки за последний год, причем System.Net.Http, System.IO и System.Runtime были основными виновниками добавления неправильных перенаправлений. Это причинило нам много горя, но я нашел ряд шагов, которые все исправили для нас.

  1. Удалить все переадресации привязки из всех проектов
  2. Откройте консоль диспетчера пакетов
  3. Беги Get-Project –All | Add-BindingRedirect

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

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

person John H    schedule 12.05.2019
comment
Спасибо за ваше предложение - я попытался точно следовать шагам, и это фактически отказало от проекта, с которым я борюсь: Add-BindingRedirect : Project 'Libraries\Teller.Charts' is not found. At line:1 char:20 + Get-Project -All | Add-BindingRedirect + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Libraries\Teller.Charts:String) [Add-BindingRedirect], ItemNotFoundException + FullyQualifiedErrorId : NuGetProjectNotFound,NuGet.PackageManagement.PowerShellCmdlets.AddBindingRedirectCommand Проект есть, он строится... Запутанно! - person Rune Jacobsen; 12.05.2019
comment
Кроме того... родственный проект обнаруживается просто отлично, если я просто запускаю Get-Project с его именем, а этот не найден. Что-то странное происходит с моим проектом? Так казалось бы. - person Rune Jacobsen; 12.05.2019
comment
Похоже, это было связано с переходом от packages.config к PackageReference. Возврат назад позволил Get-Project найти проект. К сожалению, после разрешения обновить app.config с помощью Add-BindingRedirect проблема осталась. :( - person Rune Jacobsen; 12.05.2019
comment
@RuneJacobsen Спасибо, что попробовали вышеизложенное, и извините, это не сработало для вас. Я не сталкивался с этой проблемой раньше. Один вопрос: вы действительно пытались установить пакет System.Text.Encoding.CodePages в свой проект? - person John H; 12.05.2019
comment
Да, я пытался установить его, как в проект библиотеки классов, где используется AngleSharp, так и в исполняемый файл, который использует библиотеку классов. Я также пробовал то же самое с System.Runtime.CompilerServices.Unsafe, от которого, в свою очередь, зависели CodePages, но безуспешно. - person Rune Jacobsen; 12.05.2019
comment
Просто для полноты - я также пытался обновить CodePages и CompilerServices.Unsafe до их последних версий, а не до тех, которые указаны AngleSharp, но это также не имело значения. - person Rune Jacobsen; 12.05.2019
comment
@RuneJacobsen Попробуйте удалить эти 2 перенаправления привязки. - person John H; 12.05.2019
comment
Только что сделал - та же ошибка, что и в моем исходном сообщении. Спасибо за попытку. :) - person Rune Jacobsen; 12.05.2019
comment
@RuneJacobsen Нет проблем. На какую версию фреймворка рассчитана ваша библиотека классов? - person John H; 12.05.2019
comment
Библиотека классов имеет целевую платформу .NET Framework 4.7.2. - person Rune Jacobsen; 12.05.2019
comment
@RuneJacobsen Я действительно в тупике, но я видел эту проблему для самого AngleSharp. Кажется, у других людей была такая же проблема. Я думаю, вы пробовали все, что там предлагалось, но, возможно, стоит перепроверить. - person John H; 12.05.2019
comment
@RuneJacobsen Возможно, вы могли бы попробовать использовать версию AngleSharp, которая < 0.10.0, чтобы посмотреть, поможет ли это. - person John H; 12.05.2019
comment
Опоздал сюда, завтра буду следить за этими моментами, большое спасибо за попытку помочь! - person Rune Jacobsen; 13.05.2019
comment
@RuneJacobsen Нет проблем, приятель. Мне то же самое. Приятного аппетита. :) - person John H; 13.05.2019
comment
Спасибо! Я попытался установить AngleSharp 0.9.11 (после удаления более новой версии и ее зависимостей), но, увы, та же проблема. Интересно, что я получаю в журнале Calling assembly : AngleSharp, Version=0.11.0.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea. - это совпадает с версией на диске, равной 0.11.0.0 (и версия файла, и версия продукта). - person Rune Jacobsen; 13.05.2019
comment
Кажется, независимо от того, какой пакет NuGet я добавляю, версия, которая оказывается в моем каталоге сборки, — 0.11.0.0. Здесь должен быть полтергейст. - person Rune Jacobsen; 13.05.2019
comment
@RuneJacobsen Этого не должно происходить, если вам не нужно объединять версии пакетов в ваших проектах. Возможно, выполните текстовый поиск этой версии пакета, чтобы убедиться, что ничто другое не ссылается на нее по ошибке (хотя объединение ваших пакетов должно решить эту проблему). Вы также можете сделать чистую и полную перестройку после этого. - person John H; 13.05.2019
comment
Это законно сводит меня с ума, приятель. Я очистил решение, физически удалил каталоги bin\Debug как для библиотеки классов, так и для исполняемого файла, который использует библиотеку, проверил, что только библиотека использует AngleSharp во всем решении, и что это 0.9.9.2. Я проверил каталог пакетов решений, и версия AngleSharp точно 0.9.9.2. Я даже переключился с VS2019 на VS2017 на случай, если что-то пошло не так. Итак, я строю... и AngleSharp v0.11.0.0 (отображаемый как v0.12.0.0 в NuGet) возвращается в каталоги отладки. Откуда идет!? :О - person Rune Jacobsen; 13.05.2019
comment
Я стал ядерным. Я отключил ReSharper (на всякий случай, если он выполнял кэширование), я очистил все кэши NuGet для всех версий, я провел поиск AngleSharp по всей файловой системе на всех дисках моего ПК для разработки и жестко удалил все, что смог найти. Файлов с AngleSharp в имени нет, и нет файлов, содержащих в себе текст AngleSharp, которые найдет проводник или FileSeek. Итак, я снова открыл проект (на этот раз в VS17), попытался собрать... Ошибка, не удается восстановить AngleSharp 0.12.0.0... Пытался открыть его в VS Code, он сообщает о той же ошибке. Я понятия не имею, где ссылка! - person Rune Jacobsen; 14.05.2019
comment
Просто чтобы быть конкретным. В файле csproj нет ничего, что бы ссылалось на AngleSharp. В packages.config нет ничего, что бы ссылалось на AngleSharp. Обнуление кеша NuGet разозлило его, но я все еще не могу найти то, что говорит VS (Code), что этот пакет необходим. - person Rune Jacobsen; 14.05.2019
comment
@RuneJacobsen Извините, вы все еще боретесь с этим. У меня почти нет идей, за исключением создания нового решения 4.7.2 с 2 проектами, 1 библиотекой классов и 1 веб-приложением, установки в него AngleSharp (попробуйте несколько версий) и посмотреть, сможете ли вы воспроизвести его в сжатом виде. способ. - person John H; 14.05.2019
comment
Джон Х. Не нужно извиняться, вы не несете ответственности за ситуацию и все еще пытаетесь помочь, большое спасибо. :) Через какое-то время я нашел не найденный ранее почему-то project.assets.json, очистил его от всех ссылок на AngleSharp и попытался установить более старую версию. Это не сработало из-за изменений API, поэтому я пытался двигаться вверх, пока снова не столкнулся с проблемой перенаправления CodePages. Так что, по крайней мере, я вернулся к исходной проблеме - я посмотрю, смогу ли я заставить перенаправление работать на старом звере, тогда... - person Rune Jacobsen; 14.05.2019

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

Как уже упоминалось, среда выполнения представляет собой сервер Win2008R2. Компиляция системы для .Net 4.7.2, казалось, работала нормально, пока не был вызван AngleSharp (и он, в свою очередь, вытащил ссылку на CodePages).

Теперь, поговорив с Флорианом, руководителем проекта AngleSharp, он забеспокоился о том, что в GAC может скрываться что-то нехорошее. Искал, ничего не нашел - но заметил, что .Net 4.7.2 действительно не установлен на сервере! И вскоре я понял, почему - ничего, кроме 4.6.2(?), на самом деле не поддерживается на этой древней платформе.

Это никоим образом не объясняет, почему мой собственный код, скомпилированный для 4.7.2, работал без сучка и задоринки, но терпел неудачу, как только вызывал внешнюю библиотеку классов. Однако это, вероятно, объясняет это тому, кто знает о средах выполнения .NET больше, чем я.

Итак, я установил проекты версии 4.6.2, скомпилировал, и теперь все работает как по маслу. Нет проблем с загрузкой каких-либо зависимостей или чего-либо еще.

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

Помните о своих версиях и поддержке платформ, ребята. :|

person Rune Jacobsen    schedule 20.05.2019
comment
Молодцы за вашу настойчивость в том, чтобы добраться до сути, и спасибо за публикацию здесь. - person John H; 26.05.2019