MS Office Word VSTO "Загрузка по требованию"
Мы разработали продукт, который является стандартным дополнением VSTO (Word 2010 и Word 2013, только x86). По умолчанию, когда он установлен, он устанавливается для всех пользователей (т.е. Записи реестра addin вставляются в HKLM - HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node]\Microsoft\Office\Word\Addins
).
Когда значение для ключа reg LoadBehavior
установлено на 0x3
(т.е. "Load at Startup" ), добавление работает отлично, однако, когда мы устанавливаем значение для LoadBehavior
в 0x10
(т.е. "Загрузка по требованию" ), добавление не работает, как и следовало ожидать:
Из-за UAC (и что Word не запускается с повышением) значение LoadBehavior
в HKLM не изменяется с 0x10
до 0x9
, а вместо этого переопределяется созданием ключа LoadBehavior
(со значением 0x9
) в улье HKCU.
К сожалению, мы обнаружили, что это переопределенное значение HKCU не принимается во внимание , если в манифестах HKCU не присутствует ключ Manifest вместе с LoadBehavior
). Дополнительная информация по этой теме: https://social.msdn.microsoft.com/Forums/vstudio/en-US/3776734b-333e-423b-9c08-7c7a441c3e94/load-behavior-and-word-addin?forum=vsto
"Очевидным" средством для этой проблемы является запись Manifest
в HKCU для каждого пользователя (а также в HKLM) во время установки ИЛИ, когда каждый пользователь запускает addin в первый раз, Однако есть некоторые серьезные недостатки в этом подходе:
- Для удаления приложения требуется удалить все значения HKCU пользователя, чтобы пользователи не столкнулись с проблемами при загрузке (это не рекомендуется и создает другие проблемы/сложности, такие как необходимость использования Active Setup - Удалить реестр ключи под HKCU для каждой установки машины).
- Пользователи, которые имеют эти значения в своем (роуминге) ульце HKCU, испытывают проблемы при входе на компьютер в том же домене, у которого нет нашего дополнения.
Является ли это ошибкой, что манифест не получен из HKLM, где LoadBehavior
установлен соответствующим образом в HKCU? Я думаю, что эта проблема будет решена, если LoadBehavior
в HKLM можно переопределить в HKCU без необходимости переопределения значения Manifest
.
Кто-нибудь знает, как преодолеть эту проблему?
Ответы
Ответ 1
Заканчивая установку UAC на "Никогда не уведомлять", я не знаю, как правильно решить ваши проблемы. Тем не менее, я собираюсь предложить обходное решение, которое позволит вам по существу загружать по запросу.
Я предлагаю вам изменить добавление VSTO LoadBehavior
в 0x0
(без загрузки - не загружать автоматически), а затем использовать команду VBA в автоматически загружаемом шаблоне для управления при загрузке надстройки. Ниже приведено описание шагов, которые нужно предпринять:
- В Visual Studio убедитесь, что лента в вашем добавлении закодирована как XML файл (не созданный с помощью Visual Designer). Внутри этой ленты определите собственное пространство имен.
- Создайте шаблон Word (
.dotm
). Используя Custom UI Editor для Microsoft Office, встройте в этот шаблон XML для вкладок ленты, который помечен и помещен так же, как и один из вашего добавления -в. Определите пространство имен в XML так же, как и в XML-коде Visual Studio, чтобы они имели одно и то же пространство имен. Кроме того, определите кнопку, которая будет загружать вашу добавку (и, возможно, выполнять дополнительные функции в вашем добавлении).
-
Внутри шаблона напишите суб, чтобы загрузить выгруженный 0x0
addin с помощью этого кода:
Application.COMAddIns(ProgID).Connect = True
ProgID
- это либо элемент idex вашего ProgID, либо фактическое имя ProgID в кавычках.
-
Внутри шаблона напишите обратный вызов, который вызовет код для загрузки добавления из кнопки.
-
Поместите шаблон в каталог Word STARTUP. Для Word 2010, C:\Program Files (x86)\Microsoft Office\Office14\STARTUP
Что нам нужно, так это то, что при запуске Word добавляется добавление VSTO, но оно не загружается. Созданный вами шаблон загружается автоматически из каталога STARTUP и помещает вкладку ленты для вашего приложения в Word. Поскольку добавление VSTO не загружено, эти элементы управления в настоящее время не видны. Однако после выполнения вышеприведенных шагов, когда нажата кнопка из XML шаблона, ваш аддон будет загружать элементы управления на одну ленту, потому что они разделяют пространство имен. И когда Word закрыт и перезапущен, он сбрасывается до установки VSTO, но не загружается.
Сделав этот шаг дальше, если вы хотите избежать дополнительного щелчка по загрузке элементов управления добавлением VSTO, вы могли бы, возможно, воссоздать XML-дополнение VSTO в шаблоне и иметь каждый код вызова управления для загрузки вашего дополнения VSTO, скрыть шаблон ленточные элементы управления и выполнять свои функции добавления. Таким образом, у вас будет ваша лента-заполнитель, предоставленная шаблоном XML, и реальная загрузка и выполнение добавлений по запросу.
Ответ 2
Причина, по которой вы используете Load On Demand, скорее всего, заключается в улучшении производительности запуска, как описано в MSDN. Однако загрузка по требованию сопровождается целым набором проблем (без поддержки динамического состояния интерфейса Ribbon, проблем с развертыванием HKLM и т.д.).
Как вы уже сказали, проблем с загрузкой при запуске нет. Поэтому рекомендуемым способом загрузки надстройки является использование значения LoadBehavior
0x3
.
Если вы сталкиваетесь с проблемами с загрузкой надстроек, одним из решений может быть использование легкой надстройки, которая всегда загружается при запуске, а затем эта надстройка действует как загрузчик для фактического добавления, в.