MS Office Word VSTO «Загрузка по требованию»

Мы разработали продукт, являющийся стандартной надстройкой VSTO (только для Word 2010 и Word 2013, x86). По умолчанию при установке он устанавливается для всех пользователей (т.е. записи реестра надстройки вставляются в HKLM - HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node]\Microsoft\Office\Word\Addins).

Когда значение для ключа LoadBehavior установлено на 0x3 (т.е. «Загрузка при запуске»), надстройка работает отлично, однако, когда мы устанавливаем значение для LoadBehavior на 0x10 (т.е. «Загрузка по запросу»), надстройка не работает. работать так, как мы и ожидали:

Из-за UAC (и того, что Word не работает с повышенными правами) значение LoadBehavior в HKLM не изменяется с 0x10 на 0x9, а вместо этого переопределяется путем создания ключа LoadBehavior (со значением 0x9) в кусте HKCU.

К сожалению, мы обнаружили, что это переопределенное значение HKCU не принимается во внимание, если ключ манифеста не присутствует в кусте HKCU вместе с 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) во время установки ИЛИ, когда каждый пользователь запускает надстройку в первый раз. Однако у этого подхода есть несколько серьезных недостатков:

  • Удаление надстройки требует удаления всех пользовательских значений HKCU, чтобы у пользователей не возникало проблем с загрузкой (это не рекомендуется и создает другие проблемы/осложнения, такие как необходимость использования Active Setup — Удалить ключи реестра в HKCU при установке на машину).
  • Пользователи, которые имеют эти значения в своем (перемещаемом) кусте HKCU, испытывают проблемы при входе на компьютер в том же домене, на котором не установлена ​​наша надстройка.

Является ли ошибкой то, что манифест не получается из HKLM, где LoadBehavior правильно установлен в HKCU? Я думаю, что эта проблема была бы решена, если бы LoadBehavior в HKLM можно было переопределить в HKCU без необходимости переопределения значения Manifest.

Кто-нибудь знает способ преодолеть эту проблему?


person RoKa    schedule 17.09.2015    source источник


Ответы (2)


Если не считать настройки UAC на «Никогда не уведомлять», я не знаю, как напрямую решить ваши проблемы. Однако я собираюсь предложить обходной путь, который позволит вам фактически загружать по запросу.

Я предлагаю вам изменить надстройку VSTOLoadBehavior на 0x0 (выгружено — не загружать автоматически), а затем использовать команду VBA в автоматически загружаемом шаблоне для управления загрузкой надстройки. Вот схема шагов, которые нужно предпринять:

  1. В Visual Studio убедитесь, что лента в вашей надстройке закодирована как файл XML (не созданный с помощью Visual Designer). На этой ленте определите собственное пространство имен.
  2. Создайте шаблон Word (.dotm). Использование встроенного Редактора пользовательского интерфейса для Microsoft Office в этом шаблоне XML для вкладки ленты, которая помечена и расположена так же, как вкладка из вашей надстройки. Определите пространство имен в XML так же, как и в XML-коде Visual Studio, чтобы они использовали одно и то же пространство имен. Кроме того, определите кнопку, которая будет загружать вашу надстройку (и, возможно, выполнять дополнительные функции в вашей надстройке).
  3. В вашем шаблоне напишите подпрограмму для загрузки вашей незагруженной надстройки 0x0, используя этот код:

    Application.COMAddIns(ProgID).Connect = True

    ProgID — это либо индекс элемента вашего ProgID, либо фактическое имя ProgID в кавычках.

  4. В вашем шаблоне напишите обратный вызов, который вызовет код для загрузки надстройки с кнопки.

  5. Поместите шаблон в каталог STARTUP Word. Для Word 2010 это C:\Program Files (x86)\Microsoft Office\Office14\STARTUP

Мы хотим, чтобы при запуске Word надстройка VSTO была установлена, но не загружена. Созданный вами шаблон автоматически загружается из каталога STARTUP и размещает вкладку ленты для вашего приложения в Word. Поскольку надстройка VSTO не загружена, эти элементы управления в настоящее время не видны. Однако после выполнения описанных выше шагов при нажатии кнопки из XML-файла шаблона ваша надстройка загрузит свои элементы управления на ту же ленту, поскольку они имеют общее пространство имен. И когда Word закрывается и перезапускается, он сбрасывается на установленную, но не загруженную надстройку VSTO.

Сделав еще один шаг вперед, если вы хотите избежать дополнительного щелчка при загрузке элементов управления надстройки VSTO, вы могли бы воссоздать XML надстройки VSTO в шаблоне и иметь каждый код вызова элемента управления для загрузки вашей надстройки VSTO, скрыть элементы управления ленты шаблона, и выполняйте функции вашей надстройки. Таким образом, у вас будет лента-заполнитель, предоставленная XML-шаблоном, и реальная надстройка, загружающая и выполняющая действия по запросу.

person joeschwa    schedule 21.12.2015

Причина, по которой вы используете Load On Demand, скорее всего, заключается в повышении производительности запуска, как описано в MSDN. Однако загрузка по запросу связана с целым набором проблем (отсутствие поддержки динамического состояния пользовательского интерфейса ленты, проблемы с развертыванием HKLM и т. д.).

Как вы уже сказали, проблем с Загрузить при запуске нет. Поэтому рекомендуемый способ загрузки надстройки — использовать LoadBehavior значение 0x3.

Если у вас возникли проблемы с производительностью загрузки надстроек, одним из решений может быть использование облегченной надстройки, которая всегда загружается при запуске, а затем эта надстройка действует как загрузчик для фактической надстройки.

person Dirk Vollmar    schedule 03.12.2015
comment
Спасибо за это @dirk-vollmar. Просто чтобы уточнить, основная причина желания использовать LoadOnDemand заключается не в том, что у нас есть медленная надстройка, а в том, что у нас есть много-много надстроек, которые все критически важны для бизнеса. Они конкурируют за ресурсы и часто конфликтуют и вызывают ошибки, если загружаются одновременно. Увы, нам приходится жить в мире, где мы не можем менять чужие надстройки, а когда у вас их столько же, сколько у большинства наших клиентов, вы не можете просить их всех улучшить их нагрузку. - person RoKa; 04.12.2015