Загрузка и выполнение внешней команды с использованием Assembly.LoadFrom()

Автор Тема: Загрузка и выполнение внешней команды с использованием Assembly.LoadFrom()  (Прочитано 2433 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Перечитал уже кучу всего и запутался совсем. Прошу меня распутать)
Итак, если сделать команду по статье Hello World, то все нормально. Делаем проект, собираем его, создаем файл манифеста и моя команда появляется на вкладке Add-ins
Однако, в моем случае вариант не подходит. Я начал было делать по аналогии с автокадом. Т.е. у меня есть приложение, которое при загрузке в ревит грузит dll-ки команд. Примерно так:
Код - C# [Выбрать]
  1. public class ModPlus : IExternalApplication
  2. {
  3.     public Result OnStartup(UIControlledApplication application)
  4.     {
  5.         try
  6.         {
  7.             // Принудительная загрузка сборок
  8.             LoadAssms();
  9.             InitConfigFile();
  10.             MpVars.ReadVarsFromSettingsfile();
  11.             LoadFunctions();
  12.             // Load ribbon
  13.             if (MpVars.MpRibbon)
  14.                 ModPlus_Revit.App.RibbonBuilder.BuildRibbon();
  15.             else
  16.                 ModPlus_Revit.App.RibbonBuilder.RemoveRibbon();
  17.             // Загрузка основного меню (с проверкой значения из файла настроек)
  18.             MpMenuFunction.LoadMainMenu();
  19.             return Result.Succeeded;
  20.         }
  21.         catch (Exception exception)
  22.         {
  23.             // Тут отображение ошибки должно быть в обычном окне, т.к. сборки могли еще не загрузилится
  24.             TaskDialog.Show("ModPlus", exception.Message + Environment.NewLine + exception.StackTrace,
  25.                 TaskDialogCommonButtons.Ok);
  26.             return Result.Failed;
  27.         }
  28.     }
В методе LoadFunctions() происходит загрузка dll-ок с помощью Assembly.LoadFrom(). Все работает, все грузится
Дальше, я хочу, чтобы создавалась моя собственная вкладка на ленте. Тут в общем проблем особо нет - все аналогично работе с автокадом. И вот почти на финале реализации я столкнулся с проблемой. Если в случае автокада я создаю на ленте кнопку, то при нажатии на нее вызов команды происходит с использованием простого Application.DocumentManager.MdiActiveDocument.SendStringToExecute()
А вот в Ревите таких "возможностей" нет

Вопрос - как можно "запустить" команду, которую я загрузил через Assembly.LoadFrom()?

Отмечено как Решение Александр Пекшев aka Modis 12-03-2017, 20:34:54

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вопрос исчерпан. Ответ тут.
Просто у меня сразу не получалось почему-то заставить все работать)

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Сразу поясню вопрос, который может возникнуть - зачем использовать Assembly.LoadFrom(), если при нажатии на кнопку происходит загрузка библиотеки?
Дело в том, что у меня при построении ленты используются иконки, которые являются ресурсами в загружаемых библиотеках и поэтому их нужно загрузить, чтобы указать uri на эти ресурсы. Плюс - в этих библиотеках "прикручен" еще один интерфейс, который нужно проверять