Можно ли отловить загрузку (открытие) палитры?

Автор Тема: Можно ли отловить загрузку (открытие) палитры?  (Прочитано 6613 раз)

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Сам не могу найти никакой подходящей информации, поэтому иду к опытным людям за помощью. Именно за помощью, т.к. я просто не знаю как решить данную проблему - нужна идея((
Имеется две библиотеки:
Библиотека №1 - создает и грузит палитру в автокад
Библиотека №2 - некая функция, которая должна в палитру, построенную библиотекой №1, добавить новую вкладку

Ну и самая главная проблема - сначала грузится Библиотека №2, а потом уже Библиотека №1. Соответственно, вариант с автозагрузкой не срабатывает должным образом.

Подобная проблема встречалась с построением Ленты и решалась следующим образом:
- при загрузке библиотеки мы подписываемся на событие AcApp.SystemVariableChanged += AcApp_SystemVariableChanged;
- при изменении системной переменной WSCURRENT строили ленту

А вот каким образом можно отловить открытие (создание) палитры? И возможно ли это вообще?
З.Ы. К сожалению, нет возможности поменять местами загрузку описанных библиотек

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В "Библиотека №2" проверяешь состав загруженных сборок. Если "Библиотека №1" уже загружена, то выполняешь своё "добавить новую вкладку". Ежели "Библиотека №1" ещё не подгружена, то подписываешься на событие загрузки сборок. После того, как поймаешь загрузку "Библиотека №1", отписываешься от обозначенного события и выполняешь своё "добавить новую вкладку".

P.S. Подразумевается, что у тебя объект палитры доступен в "Библиотека №1" как некоторое статическое свойство, инициализированное к моменту обращения к нему из "Библиотека №2".

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Второй вариант: если ты знаешь каталог, в котором "Библиотека №1" находится, то это ещё проще - в коде "Библиотека №2" выполняешь принудительную загрузку "Библиотека №1", после чего выполняешь своё "добавить новую вкладку".

Оба обозначенных вариантов являются достаточно очевидными и простыми в реализации, при условии, что вопрошающий не ленится читать документацию и различного рода книжки по программированию в .NET. В случае Modis я уже много лет как не удивляюсь возникновению подобных вопросов, ибо читать он не любит (чего собственно никогда и не скрывал)... :(

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Как же Андрей меня "любит"  ;D ;D ;D
Да, варианты хорошие и очевидные, но, к сожалению, не подходят ((
В своем вопросе я слишком просто все описал, а дела обстоят немного сложнее:
Дело в том, что Библиотека №1, которая создает палитру - сама же и грузит Библиотеку №2. Конечно, тут проблем никаких не должно быть, если сначала построить палитру, а потом уже грузить библиотеку №2, но ситуация сложилась так, что я не могу поменять эти события местами
Думаю, первый вариант может сработать, если Андрей подскажет мне что нужно почитать ;)

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Как же Андрей меня "любит"  ;D ;D ;D
Пора бы уж привыкнуть, что я всё время ворчу и не только в твой адрес. :) Я вообще "люблю" тех, кто читать ленится настолько, что предпочитает программировать методом тыка. :)

а, варианты хорошие и очевидные, но, к сожалению, не подходят ((
...
Думаю, первый вариант может сработать, если Андрей подскажет мне что нужно почитать ;)
Так подоконник всё же должен быть вровень ["не подходят"] с плоскостью стены или же выступать за неё ["может сработать"]? :)

... если Андрей подскажет мне что нужно почитать ;)
Если пойти по пути первого варианта, то почитать тебе нужно про домены приложений (класс AppDomain). Там ты найдёшь и то, как нужную сборку загрузить, и то, как разрулить ситуацию, когда нужную сборку не удалось загрузить, в то время как ты знаешь где эта сборка лежит. Там же и события, оповещающие о загрузке очередной сборки в домен. В указанном мною на этом сайте перечне литературы, ты можешь найти эту информацию (помимо MSDN), например в книгах п.2 и п.3. Но это же нужно читать... Сможешь заставить себя? ;)


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
И ещё: я как-то не вижу из твоего описания причины, по которой мой второй вариант тебе не подходит. Насколько я вижу, в твоей ситуации он является самым простым вариантом решения твоей проблемы.
Конечно, тут проблем никаких не должно быть, если сначала построить палитру, а потом уже грузить библиотеку №2, но ситуация сложилась так, что я не могу поменять эти события местами
Этой фразы я всё же не понял. Что тебе мешает построить палитру при загрузке "библиотеки №1" до того, как код твоей "библиотеки №2" обратится к этой палитре?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Что тебе мешает построить палитру при загрузке "библиотеки №1" до того, как код твоей "библиотеки №2" обратится к этой палитре?
Я думаю, что мешает только одно - требуется переписать нормально код, а это делать сложно и не хочется и ищется способ как сделать очередной костыль.
Александр Пекшев aka Modis
Я не прав?
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я не прав?
нет, не правы)) В данном случае - так сложились обстоятельства в связи с уже многолетней постепенной разработкой моего продукта. И то, что сначала грузится библиотека №2, а потом уже строится палитра (к которой библиотека №2 должна подключится) я уже, в принципе, не могу изменить

Вопрос к Андрею - правильно ли я думаю, что мне нужно использовать AppDomain.AssemblyResolve? И можно ли своими словами объяснить как это событие работает? Я его попробовал и у меня в принципе получилось то, что мне нужно, но я не уверен в верности подхода. Может правильней использовать AppDomain.AssemblyLoad?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вопрос к Андрею - правильно ли я думаю, что мне нужно использовать AppDomain.AssemblyResolve?
...
Я его попробовал и у меня в принципе получилось то, что мне нужно, но я не уверен в верности подхода. Может правильней использовать AppDomain.AssemblyLoad?
Я не в курсе, что у тебя там в коде понаписано, соответственно не могу утверждать что в твоём контексте "нужно" или "не нужно", "правильней" или "не правильней".
И можно ли своими словами объяснить как это событие работает?
А что там можно было не понять, при условии, что ты реально прочитал(!!!) информацию о данном событии в одном из обозначенных мною выше источников? Сильно подозреваю, что ты в очередной раз не осилил "много букафф" (хотя их там и не много) и юзал свой любимый "метод слепого тыка"...