VSTO разрешение зависимостей надстройки - PullRequest
0 голосов
/ 31 августа 2010

У меня есть надстройка VSTO, которая отлично работает. Я пытаюсь дать ему механизм загрузки плагинов, чтобы другие могли добавлять плагины к моему плагину. Знаю, я звучу ужасно, но сейчас это лучший вариант.

Я публикую свой плагин в папке «Опубликованные». Это создает манифест приложения (Symbols.application), а также папку с именем Symbols_x.y.xx.yy, в которой находятся фактические сборки надстроек. Visual Studio увеличивает этот номер версии каждый раз, когда я публикую, поэтому сборки никогда не оказываются в одном и том же месте дважды.

Плагины находятся в папке Опубликованные \ Плагины. Я загружаю сборки плагинов, используя Assembly.LoadFile (строка), и это работает нормально. Все плагины находятся в папке, которая остается в одном и том же месте, независимо от того, сколько раз я ее публикую, и я могу сканировать эту папку на наличие DLL и загружать их.

Что не работает, так это то, что эти подключаемые библиотеки DLL имеют зависимости. В частности, один зависит от COM-объекта. Visual Studio создает автоматическую библиотеку Interop DLL, которую она помещает в папку «Опубликованные \ плагины» вместе с соответствующей библиотекой подключаемого модуля. Исключение выдается, как только делается любая попытка получить доступ к COM-объекту, говоря, что сборка взаимодействия не найдена.

Помещение interop DLL в папку Опубликованная \ Symbols_x.y.xx.yy работает, но для этого необходимо каждый раз вручную помещать ее туда. Я пытался добавить плагины в PrivateBinPath AppDomain, но в документации говорится, что все, что находится за пределами ApplicationBase, будет проигнорировано, и кажется, что это действительно так - он не работает. Для ApplicationBase установлено значение Опубликовано \ Symbols_x.y.xx.yy.

Мне кажется, у меня есть четыре варианта:

  • Узнайте, как изменить ApplicationBase, переместив его на один уровень вверх, а затем добавьте папку Опубликованные \ Плагины в PrivateBinPath AppDomain.
  • Внесите некоторые изменения в манифест приложения, чтобы указать, что сборки могут загружаться автоматически из публикации \ подключаемых модулей.
  • Найдите другой способ явной загрузки сборки в домен приложений, а не только в память, используя Assembly.LoadFile.
  • Все, что кто-либо хочет предложить!

Но я не могу найти способ заставить любой из этих вариантов работать. Помогите! * * 1023

1 Ответ

0 голосов
/ 02 сентября 2010

Решение предоставлено на форумах MSDN:

Я добавил обработчик событий в AppDomain.CurrentDomain.AssemblyResolve. Это дает вам возможность загрузить сборку любым удобным для вас способом, в том числе путем загрузки ее из каталога моих плагинов.

...