Ошибка "Средство обновления, которое в данный момент не установлено"

Автор Тема: Ошибка "Средство обновления, которое в данный момент не установлено"  (Прочитано 5297 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет.
Разрабатывал плагин, который использует IUpdater (далее для простоты написания буду называть его "апдейтер").
Плагин позволяет включить/отключить апдейтер из окна плагина.
Плагин реализован от интерфейса IExternalApplication. Скажем так - загружаемая часть. В методе OnStartup происходит "включение" апдейтера в зависимости от настроек:
Код - C# [Выбрать]
  1. public static DimensionsDilutionUpdater DimensionsDilutionUpdater = null;
  2. public static UIControlledApplication Application;
  3. public Result OnStartup(UIControlledApplication application)
  4. {
  5.     CreateRibbonTab(application);
  6.     Application = application;
  7.     var dimDilWorkVar = Properties.Settings.Default.DimensionDilutionWorkVariant;
  8.     DimensionsDilutionUpdater = new DimensionsDilutionUpdater(application.ActiveAddInId);
  9.  
  10.     if (dimDilWorkVar == 1)
  11.         DimensionsDilution.DimDilutionOn(application.ActiveAddInId, ref DimensionsDilutionUpdater);
  12.     else DimensionsDilution.DimDilutionOff(application.ActiveAddInId, ref DimensionsDilutionUpdater);
  13.  
  14.     return Result.Succeeded;
  15. }
Сами методы вкл/выкл выглядят так:
Код - C# [Выбрать]
  1. public static void DimDilutionOn(AddInId activeAddInId, ref DimensionsDilutionUpdater updater)
  2. {
  3.     if (!UpdaterRegistry.IsUpdaterRegistered(updater.GetUpdaterId()))
  4.     {
  5.         UpdaterRegistry.RegisterUpdater(updater, false);
  6.         ElementCategoryFilter f = new ElementCategoryFilter(BuiltInCategory.OST_Dimensions);
  7.         UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), f, Element.GetChangeTypeElementAddition());
  8.     }
  9. }
  10.  
  11. public static void DimDilutionOff(AddInId activeAddInId, ref DimensionsDilutionUpdater updater)
  12. {
  13.     if (UpdaterRegistry.IsUpdaterRegistered(updater.GetUpdaterId()))
  14.     {
  15.         UpdaterRegistry.UnregisterUpdater(updater.GetUpdaterId());
  16.     }
  17. }
В окне плагина, которое открывается по команде, включение/отключение реализовано через событие ComboBox'a. При этом все ссылается ссылается на класс PlanDimensionsApplication:
Код - C# [Выбрать]
  1. if (cb.SelectedIndex == 0) // off
  2.     DimensionsDilution.DimDilutionOff(PlanDimensionsApplication.Application.ActiveAddInId,
  3.         ref PlanDimensionsApplication.DimensionsDilutionUpdater);
  4. if (cb.SelectedIndex == 1) // on
  5.     DimensionsDilution.DimDilutionOn(PlanDimensionsApplication.Application.ActiveAddInId,
  6.         ref PlanDimensionsApplication.DimensionsDilutionUpdater);

В какой-то момент времени при разработке плагина при регистрации апдейтера использовалась такая строка
Код - C# [Выбрать]
  1. UpdaterRegistry.RegisterUpdater(updater);
вместо такой
Код - C# [Выбрать]
  1. UpdaterRegistry.RegisterUpdater(updater, false);
В этот момент у пользователей (у некоторых и только в некоторых файлах) стало появляться сообщение:



Простите за качество - другой нет. Но, думаю, там все видно.

Теперь ситуация такая - это сообщение так и продолжает появляться. Причем, что интересно - я открывал файл на своем компьютере - у меня нет сообщения. Открывают этот файл на другом (при мне) - есть сообщение. Файл является хранилищем, но открывать мы его пробовали по разному (и создавая копию и нет, и открепляя и т.д. и т.п.)

Вот я не совсем могу уловить - где прописывается информация об апдейтерах? В документе? И самое главное - как эту информацию удалить??

При изучении класса UpdaterRegestry увидел метод GetRegisteredUpdaterInfos. Думал использовать эту возможность, чтобы "насильно" удалить запись об апдейтере из документа, но выяснилось, что класс UpdaterInfo не возвращает параметр UpdaterId. Теперь у меня нет идей что делать. Надеюсь на ваши хорошие идеи

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Александр, на сколько я помню, сообщение появляется в том случае, если какой то Updater был хотя бы раз запущен в проекте, а затем происходит открытие файла на компьютере, где плагин с этим Updater не установлен. Т.е. да, эта инфа в файле прописывается где-то.
открывал файл на своем компьютере - у меня нет сообщения. Открывают этот файл на другом (при мне) - есть сообщение
Вот на этом другом компьютере, где есть сообщение, установлен плагин, где этот Updater регистрируется?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вот на этом другом компьютере, где есть сообщение, установлен плагин, где этот Updater регистрируется?
Да, есть.
Я начинаю подозревать, что тут виной работа с центральным файлом хранилища. Но пока не могу придумать как это проверить, протестить и как исправить

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Да, есть.
Я начинаю подозревать, что тут виной работа с центральным файлом хранилища. Но пока не могу придумать как это проверить, протестить и как исправить
Файл справки явно говорит, что если был зарегистрирован Updater без параметра isOptional, то пользователь получит предупреждение при открытии файла без установленного плагина.
Думаю косвенно центральный файл здесь как то действительно задействован. Например, именно информация о том, что Updater был зарегистрирован и использован, некорректно синхронизируется с центральным.
Я бы выяснил для начала, какая информация хранится в центральном файле об этом Updater - обязательный или необязательный. Если я правильно понял из сообщения, то какое то время существовала версия плагина, где Updater был обязателен.
Для этого
1) Создать новую локальную копию центрального файла
2) Получить все UpdaterInfo с помощью метода UpdaterRegistry.GetRegisteredUpdaterInfos
3) Найти в списке нужный
4) Проверить свойство IsOptional.

Вообще интересно взглянуть на результат на двух компах в текущей ситуации (без создания новой локальной копии): где есть сообщение или нет.

Дальше в зависимости от результатов будем думать.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я в полном недоумении! Описываю подробно:
1. Создал маленькую библиотеку, которая в окошке выводит список апдейтеров. Тут все банально:
Код - C# [Выбрать]
  1. private void UpdatersListingWin_OnLoaded(object sender, RoutedEventArgs e)
  2. {
  3.     CbSearchIn.SelectionChanged += CbSearchIn_SelectionChanged;
  4.     CbSearchIn.SelectedIndex = 0;
  5. }
  6.  
  7. private void CbSearchIn_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
  8. {
  9.     var cb = sender as System.Windows.Controls.ComboBox;
  10.     if(cb == null) return;
  11.     if(cb.SelectedIndex == -1) return;
  12.     LvUpdaterInfos.ItemsSource = null;
  13.     var doc = _uiApplication.ActiveUIDocument.Document;
  14.  
  15.     if (cb.SelectedIndex == 0)
  16.     {
  17.         IList<UpdaterInfo> updaterInfos = UpdaterRegistry.GetRegisteredUpdaterInfos();
  18.         LvUpdaterInfos.ItemsSource = updaterInfos;
  19.     }
  20.     else
  21.     {
  22.         IList<UpdaterInfo> updaterInfos = UpdaterRegistry.GetRegisteredUpdaterInfos(doc);
  23.         LvUpdaterInfos.ItemsSource = updaterInfos;
  24.     }
  25. }
На всякий случай сделал два варианта - для приложения и для документа, но разницы нет никакой
2. Открываю центральный файл-хранилище не отвязывая его - т.е. с созданием локальной копии. Открывается без каких-либо сообщений. Запускаю вспомогательный мой плагин и вижу:



Это мой апдейтер

3. Иду с этой библиотекой на другой компьютер. Повторяем процедуру открытия ЭТОГО ЖЕ файла-хранилища точно также - с созданием локальной копии. При открытии выскакивает сообщение:



Это сообщение о моем апдейтере. Нажимаю "Продолжить работу с файлом"

4. Запускаю вспомогательную библиотеку и вижу:



Моего апдейтера даже нет в списке

У меня ни одной идеи что делать :(

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
У меня ни одной идеи что делать
Во время чтения, закончив с тремя пунктами думаю, ну сейчас вспомогательная библиотека покажет, что Updater есть и он не обязателен. Вот тогда я бы точно был в недоумении :) Но нет, пока все логично.

В данном случае явно видно, что на другом компьютере этот Updater не зарегистрирован. Нужно копать в эту сторону. Варианта 2. Либо плагин вообще не установлен, либо установлен, но не было регистрации.
Судя по первому сообщению, Updater включается в настройках плагина и регистрируется при старте Revit. Напрашивается вывод, что на твоем компе эта настройка включена, на другом нет.
Можно сделать проверку, временно добавив вывод диалога при старте. Например, так:
Код - C# [Выбрать]
  1. public static DimensionsDilutionUpdater DimensionsDilutionUpdater = null;
  2. public static UIControlledApplication Application;
  3. public Result OnStartup(UIControlledApplication application)
  4. {
  5.     CreateRibbonTab(application);
  6.     Application = application;
  7.     var dimDilWorkVar = Properties.Settings.Default.DimensionDilutionWorkVariant;
  8.     DimensionsDilutionUpdater = new DimensionsDilutionUpdater(application.ActiveAddInId);
  9.  
  10.    // вывести параметры активации апдейтера
  11.    TaskDialog.Show("DimensionsDilutionUpdater", dimDilWorkVar.ToString());
  12.  
  13.     if (dimDilWorkVar == 1)
  14.         DimensionsDilution.DimDilutionOn(application.ActiveAddInId, ref DimensionsDilutionUpdater);
  15.     else DimensionsDilution.DimDilutionOff(application.ActiveAddInId, ref DimensionsDilutionUpdater);
  16.  
  17.     return Result.Succeeded;
  18. }
И запустив ее на обоих компах. Уверен, на твоем будет 1, на другом - 0

Еще один факт, создав локальную копию центрального файла видно, что IsOptional = false. Поэтому и ругается. Мистики по прежнему нет.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Еще один факт, создав локальную копию центрального файла видно, что IsOptional = false. Поэтому и ругается. Мистики по прежнему нет
Вот по этому поводу - не совсем было ясно, что написано в справке:
Цитировать
isOptional
Type: System Boolean
This argument controls whether the updater should be required next time a document is open in which the updater had been previously used. If a non-optional updater is not found (i.e. currently not registered), the end user will be presented with a warning and choices to resolve the situation.
Мне лично не ясно поведение и что в итоге надо - true или false. И что, кстати, по умолчанию?

Так вот - когда я только делал плагин, то не задавал этот параметр. Вот с ним видимо и открыли файл.
Когда стала возникать ошибка и я начал разбираться, то уже задал значение false. После этого (когда ничего не изменилось) создал эту тему.
Сейчас, после Вашего сообщения, я поменял значение на true и пошёл проверять на "нерабочем" компе:
1. Обновили плагин, открыли файл - ошибка выскочила. Открыли плагин и включили апдейтер. Т.е. при открытии файла не вызывался метод регистрации (см. код в топике).
2. Синхронизировали локальный файл с хранилищем и закрыли
3. Открыли его снова. При каждом открытии создается (перезаписывается) новая локальная версия файла. И, о счастье - открылся без сообщения! Но меня это не остановило - запустил плагин и выключил апдейтер. Снова синхронизировали файл с хранилищем. Закрыли
4. Открыли файл снова. И привет - снова это сообщение.

Итого - независимо от значения true или false для параметра isOptional выскакивает сообщение, если при старте файла стоит вариант в плагине "не включать апдейтер".
Может я где-то что-то упускаю?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Мне лично не ясно поведение и что в итоге надо - true или false. И что, кстати, по умолчанию?
Если перевести на русский, то параметр IsOptional следует читать как Является ли Updater опциональным, т.е. необязательным. IsOptional = True значит, что Updater является необязательным.
По умолчанию - False (хотя об этом нет упоминания).

Похоже в центральном файле все равно хранится информация о том, что Updater является обязательным (IsOptional = False).
Можешь выполнить код из вспомогательной библиотеки (где видна информация об Updater) после каждого из шагов, описанного выше? Интересует что отображается в параметре IsOptional. Возможно, что решение - это замена центрального файла локальным, после того, как в локальном файле будет IsOptional = True

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Договорился с бим-менеджером. Завтра утром он сделает следующее:
1. Откроет центральный файл "как файл", а не как локальную копию.
2. Включит апдейтер. Плагин у него точно обновлен (т.е. isOptional = true). Сохранит и закроет файл
3. Затем на другом компе с обновленным плагином попробуем открыть файл с созданием локальной копии и с разными режимами включенности апдейтера

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Суть в том, что в центральном файле видимо не обновляется информация об апдейтере.
Ага, я такую мысль с самого начала и высказывал:)
Например, именно информация о том, что Updater был зарегистрирован и использован, некорректно синхронизируется с центральным.
Интересно попробовать как дела в новых версиях Revit обстоят.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Затем на другом компе с обновленным плагином попробуем открыть файл с созданием локальной копии и с разными режимами включенности апдейтера
Хм. а интересно, что будет если в центральном файле будет информация, что Updater не обязателен, но в каком то из локальных файлов останется информация, что он обязателен. Так же не синхронизируется эта информация. В любом случае тогда решение - создать новую локальную копию.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Интересно попробовать как дела в новых версиях Revit обстоят
Куда новее-то? ))) Я пробую на 2017. Новее только 2018, но у нас почему-то решили на него пока не переходить. Типа "еще не стабилен" )))
Хм. а интересно, что будет если в центральном файле будет информация, что Updater не обязателен, но в каком то из локальных файлов останется информация, что он обязателен. Так же не синхронизируется эта информация. В любом случае тогда решение - создать новую локальную копию.
Тут уже легче будет решить проблему:
1. Все должны точно обновить плагин
2. Просто создавать новую локальную копию
Думаю, это не большие проблемы

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Куда новее-то? ))) Я пробую на 2017
А, тогда пардон. Это в другой теме шла речь про 2015 версию. Я и подумал что здесь она же:)
Думаю, это не большие проблемы
Согласен. Тут чисто любопытство