Переадресация привязки при импорте AngleSharp в .Net 4.7.2 как-то пытается вытянуть NetStandard 2 как dll - PullRequest
2 голосов
/ 12 мая 2019

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

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

Итак, я развернул на сервере prod, включая изменения в 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-ОЕ МАЯ : Точка максимальной путаницы для меня - это все разные номера версий.

Пакет AngleSharp 0.12.0 NuGet зависит от 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?

Ответы [ 2 ]

1 голос
/ 20 мая 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 и все еще работает.

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

1 голос
/ 12 мая 2019

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

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

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

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

...