Как .NET 4.7.2 управляет перенаправлениями для зависимости, скомпилированной в .NET Standard 2.0? - PullRequest
2 голосов
/ 28 октября 2019

Фон

У меня большое старое монолитное приложение, которое в настоящее время предназначено для .NET Framework 4.7.2 и использует несколько недавно написанных модулей (также предназначенных для net472) безвопросы. Есть также недавно написанный модуль, предназначенный для .NET Standard 2.0, и он доставляет мне некоторые проблемы.

Все модули загружаются в основное приложение с использованием пакетов Nuget.

Ошибка

При попытке вызвать основной метод модуля (т. Е. Во время выполнения, в развернутом приложении) он выдает ошибку, говоря, что ему не удалось найти конкретную версию System.Diagnostics.DiagnosticSource, несмотря наэта библиотека DLL существует в соответствующей папке \bin.

Зависимость от System.Diagnostics.DiagnosticSource исходит от Microsoft.EntityFrameworkCore.SqlServer, которая зависит от нее как через Microsoft.EntityFrameworkCore, так и System.Data.SqlClient.

Я подозревал, что тот факт, что пакет EntityFrameworkCore вызывается из приложения net472, будет как-то связан с ним (и все еще может), но существующие модули net472 такжеиспользуйте пакет Core без ошибок. Точно такая же версия, даже!

Сложные факторы

  • Новый модуль является только библиотекой классов, гдеПоскольку старые модули являются полноценными приложениями WPF.
  • Я не могу загрузить новые пакеты Nuget на наш сервер, поэтому при каждом внесении изменений мне приходится копировать библиотеки DLL из папки \bin\Debug модуля впапка \bin в каталоге установки приложения.

Что не сработало

  • Установка пакета System.Diagnostics.DiagnosticSource Nuget в модуль,Я пробовал 4.0.3.0 (что, как утверждает сообщение об ошибке), 4.5.0 (что ожидают другие модули) и 4.5.1 (что, я думаю, соответствует версии файла, уже находящейся в каталоге установки, см. Ниже). ).
  • Создание проекта net472 в решении модуля для использования проекта netstandard2.0 без Nuget с последующим перенаправлением основного приложения для использования этого проекта через ссылку DLL.

Что сработало

  • Создание новой папки в каталоге установочной папки \bin, которая будет содержать только желаемую версию нового модуля System.Diagnostics.DiagnosticSource.dll, а именно версию файла 4.6.26515.6,Папка \bin уже содержит версию 4.6.26919.2, но модулю она не нравится.

Хотя это клудж. Мне не нужно было упаковывать две версии одной и той же DLL только потому, что у меня есть пакет Nuget, построенный на .NET Standard ...... я должен?

Куда мне идти?

Дополнительная информация

Вот соответствующая запись в fuslogvw. Обратите внимание, что он утверждает, что ищет версию 4.0.3.0, несмотря на то, что MyApp.exe.config имеет перенаправление, указывающее 0.0.0.0-4.5.1, и несмотря на то, что VS показывает зависимость Microsoft.EntityFrameworkCore как System.Diagnostics.DiagnosticSource (4.5.0).

*** Assembly Binder Log Entry  (10/28/2019 @ 1:22:30 PM) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\myApp\install\MyApp.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = System.Diagnostics.DiagnosticSource, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
(Fully-specified)
LOG: Appbase = file:///C:/myApp/install/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = MyApp.exe
Calling assembly : Microsoft.EntityFrameworkCore, Version=2.2.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\myApp\install\MyApp.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Redirect found in application configuration file: 4.0.3.0 redirected to 4.5.1.0.
LOG: Post-policy reference: System.Diagnostics.DiagnosticSource, Version=4.5.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/myApp/install/System.Diagnostics.DiagnosticSource.DLL.
LOG: Attempting download of new URL file:///C:/myApp/install/System.Diagnostics.DiagnosticSource/System.Diagnostics.DiagnosticSource.DLL.
LOG: Attempting download of new URL file:///C:/myApp/install/bin/System.Diagnostics.DiagnosticSource.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\myApp\install\bin\System.Diagnostics.DiagnosticSource.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: System.Diagnostics.DiagnosticSource, Version=4.0.3.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
WRN: Comparing the assembly name resulted in the mismatch: Minor Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Здесьэто запись от MyApp.exe.config:

<dependentAssembly>
    <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.5.1" newVersion="4.5.1" />
</dependentAssembly>

1 Ответ

0 голосов
/ 28 октября 2019

Похоже, что ответ «как и любые другие перенаправления».

Дамп fuslogvw показал точную проблему и объяснил все другие ошибки, которые я видел. DLL, в которую я хотел объединить (используемую всеми другими модулями, то есть версией файла 4.6.26919.2), не версия 4.5.1 сборки, но 4.0.3.1 ,

Исправление перенаправления привязки в myApp.exe.config решило проблему.

...