У меня есть устаревшее приложение, работающее на старом сервере 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?