2015-09-17 3 views
17

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

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

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

К сожалению, мы обнаружили, что это HKCU переопределяется значение не учитывается если Manifest ключ не присутствует в улей 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, чтобы пользователи испытывают проблемы с загрузкой (это не рекомендуется и создает другие проблемы/осложнение, такие, как необходимость использования активной установки - Remove registry keys under HKCU on a per machine installation).
  • Пользователи, которые имеют эти значения в своем (роумирующем) ульце HKCU, испытывают проблемы при входе в систему в том же домене, у которого нет нашего дополнения.

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

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

ответ

0

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

Как вы уже сказали, нет проблем с Нагрузка при запуске. Поэтому рекомендуемый способ загрузки надстройки - использовать значение LoadBehavior0x3.

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

+0

Спасибо за это @ dirk-vollmar. Чтобы пояснить, основная причина, почему вы хотите использовать «LoadOnDemand», заключается не в том, что у нас медленная надстройка, а потому, что у нас много и много надстроек, которые являются критичными для бизнеса. Они конкурируют за ресурсы и часто «конфликтуют» и за ошибки, если они загружаются одновременно. Увы, нам нужно жить в мире, где мы не можем изменить надстройки других, и когда у вас будет столько, сколько делают большинство наших клиентов, вы не можете попросить их всех улучшить свою нагрузку. – RoKa

1

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

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

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

    Application.COMAddIns(ProgID).Connect = True

    ProgID либо деталь IDEX вашего ProgID или фактическое имя ProgID в кавычках.

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

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

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

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