Ад зависимостей в плагине приложения .NET (C #) - PullRequest
4 голосов
/ 16 октября 2019

В настоящее время я работаю над плагином для стороннего приложения WindowsForms, где он будет сосуществовать с другими плагинами. Обратите внимание, что я не имею никакого контроля над источником или файлами, используемыми базовым приложением (будь то dll-файлы, файлы конфигурации и т. Д.), А также над другими плагинами, которые могут быть загружены во время выполнения.

Давайте представимчто один из других плагинов, при загрузке перед моим, загружает зависимость от версии 1.0 библиотеки A («A.dll»). Если мой плагин пытается загрузить версию 2.0 библиотеки A (также называемой «A.dll»), меня сразу же приветствует классическая «System.IO.FileLoadException».

После погружения в тему зависимостичерт, мне предложили несколько вариантов (например, здесь или здесь ). Однако все эти параметры, по-видимому, ориентированы на автономные приложения, над которыми разработчик обычно имеет полный контроль, которые требуют загрузки двух версий одной и той же библиотеки (возможно, для устаревшей поддержки или по любой другой странной причине). Эти решения не подходят для моего случая из-за среды плагинов. Кроме того, они часто требуют:

  • Вставка сборки в GAC, для которой AFAIK потребуется административное право на компьютере конечного пользователя, которого у меня нет;
  • Контроль надфайл конфигурации базового приложения (* .exe.config), которого у меня нет.

Может кто-нибудь помочь мне найти способ использовать более новую версию библиотеки, которая также используется, какболее старая версия, другим плагином, с учетом ограничений, которые я описал ?

Ответы [ 2 ]

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

Вы можете обработать событие AppDomain.AssemblyResolve, чтобы указать, какая сборка используется в зависимости от того, какая сборка пытается его загрузить. Для меня это похоже на взлом, но, вероятно, нет чистого способа решить эту проблему.

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

Если вы сами предоставляете библиотеку A.dll версии 2.0, вы можете переименовать ее в A.2.0.dll и ссылаться на нее.

...