Всем привет.
Разрабатывал плагин, который использует IUpdater (далее для простоты написания буду называть его "апдейтер").
Плагин позволяет включить/отключить апдейтер из окна плагина.
Плагин реализован от интерфейса IExternalApplication. Скажем так - загружаемая часть. В методе OnStartup происходит "включение" апдейтера в зависимости от настроек:
public static DimensionsDilutionUpdater DimensionsDilutionUpdater = null;
public static UIControlledApplication Application;
public Result OnStartup(UIControlledApplication application)
{
CreateRibbonTab(application);
Application = application;
var dimDilWorkVar = Properties.Settings.Default.DimensionDilutionWorkVariant;
DimensionsDilutionUpdater = new DimensionsDilutionUpdater(application.ActiveAddInId);
if (dimDilWorkVar == 1)
DimensionsDilution.DimDilutionOn(application.ActiveAddInId, ref DimensionsDilutionUpdater);
else DimensionsDilution.DimDilutionOff(application.ActiveAddInId, ref DimensionsDilutionUpdater);
return Result.Succeeded;
}
Сами методы вкл/выкл выглядят так:
public static void DimDilutionOn(AddInId activeAddInId, ref DimensionsDilutionUpdater updater)
{
if (!UpdaterRegistry.IsUpdaterRegistered(updater.GetUpdaterId()))
{
UpdaterRegistry.RegisterUpdater(updater, false);
ElementCategoryFilter f = new ElementCategoryFilter(BuiltInCategory.OST_Dimensions);
UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), f, Element.GetChangeTypeElementAddition());
}
}
public static void DimDilutionOff(AddInId activeAddInId, ref DimensionsDilutionUpdater updater)
{
if (UpdaterRegistry.IsUpdaterRegistered(updater.GetUpdaterId()))
{
UpdaterRegistry.UnregisterUpdater(updater.GetUpdaterId());
}
}
В окне плагина, которое открывается по команде, включение/отключение реализовано через событие ComboBox'a. При этом все ссылается ссылается на класс PlanDimensionsApplication:
if (cb.SelectedIndex == 0) // off
DimensionsDilution.DimDilutionOff(PlanDimensionsApplication.Application.ActiveAddInId,
ref PlanDimensionsApplication.DimensionsDilutionUpdater);
if (cb.SelectedIndex == 1) // on
DimensionsDilution.DimDilutionOn(PlanDimensionsApplication.Application.ActiveAddInId,
ref PlanDimensionsApplication.DimensionsDilutionUpdater);
В какой-то момент времени при разработке плагина при регистрации апдейтера использовалась такая строка
UpdaterRegistry.RegisterUpdater(updater);
вместо такой
UpdaterRegistry.RegisterUpdater(updater, false);
В этот момент у пользователей (у некоторых и только в некоторых файлах) стало появляться сообщение:
Простите за качество - другой нет. Но, думаю, там все видно.
Теперь ситуация такая - это сообщение так и продолжает появляться. Причем, что интересно - я открывал файл на своем компьютере - у меня нет сообщения. Открывают этот файл на другом (при мне) - есть сообщение. Файл является хранилищем, но открывать мы его пробовали по разному (и создавая копию и нет, и открепляя и т.д. и т.п.)
Вот я не совсем могу уловить - где прописывается информация об апдейтерах? В документе? И самое главное - как эту информацию удалить??
При изучении класса UpdaterRegestry увидел метод GetRegisteredUpdaterInfos. Думал использовать эту возможность, чтобы "насильно" удалить запись об апдейтере из документа, но выяснилось, что класс UpdaterInfo не возвращает параметр UpdaterId. Теперь у меня нет идей что делать. Надеюсь на ваши хорошие идеи