Несколько плагинов с общими библиотеками

Автор Тема: Несколько плагинов с общими библиотеками  (Прочитано 2448 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 1102
  • Карма: 194
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Во-первых не следует полагаться на порядок загрузки. Я не проверял, но мне кажется, что он читает каталоги внутри ApplicationPlugins и обрабатывает их не в алфавитном порядке, а в том порядке в котором они находятся в каталоге (а это совершенно необязательно отсортированные по алфавиту).
Вот да, именно так! На уровне подсознания где-то, есть понимание, что это весьма ненадежно :)
Во-вторых, я бы предпочел в методе Initialize своих приложений загружать необходимые сборки если они еще не загружены, а если их загрузить не удаётся, то сообщал бы пользователю.
А это уже весьма интересная идея! Надо будет проверить, как это будет работать.
В-третьих, я бы вообще не включал их ни в какие BUNDLE'ы - если это библиотечные файлы, то зачем отдавать их загрузку на волю AutoCAD?
Да, согласен. Если Ваша идея с подгрузкой из Initialize хорошо покажет себя в работе, то от загрузки библиотеки через bundle можно отказаться.
Попробую сделать небольшой тестовый проект и обкатать идею.
Спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 6405
  • Карма: 680
  • Рыцарь ObjectARX
  • Skype: rivilis
А это уже весьма интересная идея! Надо будет проверить, как это будет работать.
Главное, чтобы у тебя не было статических переменных, которые инициализируются значениями, использующие классы и методы из этих "библиотек". Насколько я помню инициализация статических переменных происходит до вызова метода Initialize (могу ошибаться).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 447
  • Карма: 55
Я в этом моменте плюю на размер в угоду надежности. В БД если обновляется любой компонент, то автоматом создается архив со всеми сборками и пр. компонентами и при загрузке автокада "загрузчик" увидев новую версию в БД все переписывает на локальном компе (с учетом "уровня" пользователя) - то есть чистит все "свои" сборки и разворачивает по новой весь загруженный архив. И если что, можно в момент откатить до любой предыдущей версии - пока правда такое "счастье" миновало, но все возможно.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 1102
  • Карма: 194
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Главное, чтобы у тебя не было статических переменных, которые инициализируются значениями, использующие классы и методы из этих "библиотек". Насколько я помню инициализация статических переменных происходит до вызова метода Initialize (могу ошибаться).
Нет, не ошибаетесь. Это естественное поведение при загрузке любого .NET класса.
Как показали опыты, в самом Initialize, после кода подгрузки вспомогательных DLL, также нельзя использовать методы из этих DLL. Если раскомментить строки 44-46 (обращения к методам вспомогательных библиотек), то метод Initialize не выполнится и DLL с этим кодом не будет загружена. Не знаю, почему так. Возможно, что это тоже естественное поведение .NET, но я с таким еще не сталкивался.
Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 1102
  • Карма: 194
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Я в этом моменте плюю на размер в угоду надежности. В БД если обновляется любой компонент, то автоматом создается архив со всеми сборками и пр. компонентами и при загрузке автокада "загрузчик" увидев новую версию в БД все переписывает на локальном компе (с учетом "уровня" пользователя) - то есть чистит все "свои" сборки и разворачивает по новой весь загруженный архив. И если что, можно в момент откатить до любой предыдущей версии - пока правда такое "счастье" миновало, но все возможно.
У меня "загрузчиков" никаких нет. Для приложений я создаю инсталляторы с помощью WIX. Наверное, в проект инсталляции тоже можно добавить программу, которая будет анализировать уже имеющиеся приложения и библиотеки в них, но я пока до этого не дорос.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 6405
  • Карма: 680
  • Рыцарь ObjectARX
  • Skype: rivilis
Если раскомментить строки 44-46 (обращения к методам вспомогательных библиотек), то метод Initialize не выполнится и DLL с этим кодом не будет загружена. Не знаю, почему так.
Ну для начала их тоже нужно обернуть в try/catch, так как если в Initialize остаётся необработанное исключение, то сборка не работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 1102
  • Карма: 194
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Да нет, исключений там не происходит. Да я, на самом деле, уже что только не делал  :) И по отдельности пробовал раскомментить, и обработку ошибок, и логику методов вспомогательных менял. Ничего не помогает.
Я подозреваю, что есть какой-то механизм проверки обращений метода Initialize к сторонним DLL, и если они в момент обращения к методу недоступны, то сам метод не выполняется. Потому что при дебаге даже не срабатывает точка останова на входе в метод, если хотя бы одна из этих строк не закомментирована.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 1102
  • Карма: 194
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Главное, чтобы у тебя не было статических переменных, которые инициализируются значениями, использующие классы и методы из этих "библиотек".
Ваш совет натолкнул меня на идею - вынести загрузку библиотек в статический конструктор класса. В таком варианте работает как надо! Еще раз, спасибо за идею! Теперь надо обкатать ее на рабочих сборках.
Извините, вам запрещён просмотр содержимого спойлеров.

Тестовый проект - в архиве (VS 2015)