Фон
У меня большое старое монолитное приложение, которое в настоящее время предназначено для .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>