Подтвердить что ты не робот

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.

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

4b9b3361

Ответ 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.

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