Различное разрешение транзитивной сборки для динамически загружаемых сборок в .NET и .NET Framework.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Различное разрешение транзитивной сборки для динамически загружаемых сборок в .NET и .NET Framework.

Сообщение Anonymous »

Я заметил довольно любопытную разницу в поведении загрузки сборки CLR между целевыми приложениями .NET 7 и .NET Framework 4.6.1.
Для контекста позвольте мне сначала объяснить архитектура, на которой я наблюдал различия в загрузке сборки. Это своего рода система плагинов для приложений, где по сути у нас есть «эталонное» консольное приложение, ссылающееся на все остальные библиотеки netstandard2.0 из решения. Сборка «эталонного» приложения публикует двоичные файлы в папке, определенной для каждой целевой платформы (в нашем случае это net7.0 и net461). Другие приложения затем используют эти папки для динамической загрузки сборок по мере необходимости.
Мне удалось создать здесь простой репродукцию, имитирующую следующую архитектуру:
Изображение

Код: Выделить всё

TestContracts
— это проект netstandard2.0, предоставляющий интерфейс ITracer .

Код: Выделить всё

TestLibrary
— это проект netstandard2.0, он зависит от TestContract, предоставляет класс Tracer, реализующий интерфейс ITracer, а также зависит от Elastic.Clients .Elasticsearch пакет NuGet (который, в свою очередь, имеет транзитивную зависимость от пакета NuGet System.Text.Json v8.0.5, содержащего версию сборки System.Text.Json.dll) 8.0.0.0).

Код: Выделить всё

TestReferenceApp
ориентирован на net7.0 и net461, он ссылается на проекты TestContracts и TestLibrary, а сборка публикует TestReferenceApp в PublishedAppNet70 и PublishedAppNet461, относящиеся к соответствующим целевым объектам (после сборки используется интерфейс командной строки dotnetPublish — см. TestReferenceApp.csproj). — это точка входа, она зависит только от TestContracts, она загружает сборку TestLibrary динамически с помощью Assembly.LoadFrom из конкретной папки TestReferenceApp\PublishedApp* к заданной цели .NET, а затем создает экземпляр класса Tracer, приводя его к интерфейсу ITracer. При вызове метода ITracer.Trace сборка .net7.0 выдает следующее исключение при вызове метода ITracer.Trace:

Код: Выделить всё

System.IO.FileLoadException
HResult=0x80131621
Message=Could not load file or assembly 'System.Text.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Could not find or load a specific file. (0x80131621)
Source=Elastic.Clients.Elasticsearch
StackTrace:
at Elastic.Clients.Elasticsearch.ElasticsearchClientSettingsBase`1..ctor(NodePool nodePool, IRequestInvoker requestInvoker, SourceSerializerFactory sourceSerializerFactory, IPropertyMappingProvider propertyMappingProvider)
at Elastic.Clients.Elasticsearch.ElasticsearchClientSettings..ctor(NodePool nodePool, IRequestInvoker requestInvoker, SourceSerializerFactory sourceSerializer, IPropertyMappingProvider propertyMappingProvider)
at Elastic.Clients.Elasticsearch.ElasticsearchClientSettings..ctor(NodePool nodePool, IRequestInvoker requestInvoker, SourceSerializerFactory sourceSerializer)
at Elastic.Clients.Elasticsearch.ElasticsearchClientSettings..ctor(NodePool nodePool)
at Elastic.Clients.Elasticsearch.ElasticsearchClientSettings..ctor(Uri uri)
at TestLibrary.Tracer.Trace(String message) in D:\_data\GithubRepos\PaloMraz\AssemblyDependencyLoadingApp\TestLibrary\Tracer.cs:line 12
at Program.$(String[] args) in D:\_data\GithubRepos\PaloMraz\AssemblyDependencyLoadingApp\TestApp\Program.cs:line 21

This exception was originally thrown at this call stack:
System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath(string)
System.Reflection.Assembly.LoadFrom(string)
System.Reflection.Assembly.LoadFromResolveHandler(object, System.ResolveEventArgs)
System.Runtime.Loader.AssemblyLoadContext.InvokeResolveEvent(System.ResolveEventHandler, System.Reflection.RuntimeAssembly, string)

Inner Exception 1:
FileLoadException: Could not load file or assembly 'System.Text.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
Сборка net461 работает просто великолепно.
Может ли кто-нибудь пролить свет на то, почему поведение отличается?

Подробнее здесь: https://stackoverflow.com/questions/792 ... lies-under
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Использование итерации/списка/генератора динамически загружаемых приспособлений pytest
    Anonymous » » в форуме Python
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Совместно ли процессы используют разделы обычных динамически загружаемых библиотек, доступные только для чтения?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Импорт типов в динамически загружаемых модулях
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Импорт типов в динамически загружаемых модулях
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Импорт типов в динамически загружаемых модулях
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»