Прикажите слуге не слушаться Вас. Не слушаясь Вас, он ослушается приказа, так как он исполняет его, слушаясь Вас.
статья
Жорж Парадокс

VSTO Add-ins. Создание надстроек для приложений Microsoft office.

1. Вступление

Привет всем!

Ранее мной была написана статья о создании расширения для Microsoft Excel на C#, где я описывал, как с помощью библиотеки Excel-DNA можно создать надстройку, с добавлением пользовательского интерфейса на ленту, и дополнительные функции, для приложения Microsoft Excel. Библиотека Excel-DNA, надо сказать, очень неплохая библиотека, но она имеет как свои плюсы, так и очень существенные минусы.

К плюсам этой библиотеки можно отнести то, что она позволяет создавать расширения для Excel начиная с версии 2007 и выше. Так же плюсом является довольно простой интерфейс для создания дополнительных пользовательских функций, позволяя расширить и существенно улучшить встроенный набор функций Excel. Но, на этом, собственно, плюсы и заканчиваются.

А теперь минусы.

Создание визуального интерфейса надстройки на пользовательскую ленту уже не такое удобное и требует дополнительного стороннего приложения в виде какого-нибудь ribbon xml editor, если Вы, конечно, не желаете довольно досконально изучить все особенности xml-разметки ленты ribbon, чтобы создавать её самому, как говориться, ручками. Хотя, если Вы это действительно изучите, то Вам будет конечно же большой плюс.

Но, кроме не самого приятного способа создания пользовательского интерфейса, ещё и взаимодействие с ним не очень удобное. Дело в том, что прямой доступ к ленте ribbon, при использовании библиотеки Excel-DNA, крайне ограничен, и некоторые взаимодействия с элементами на этой ленте можно произвести только посредством хитрых конструкций, основанных на обработчиках событий, да и то надёжность этих конструкций вызывает вопросы.

Ну и ещё один довольно большой минус - это то, что эта библиотека позволяет создавать надстройки исключительно только для Excel, лишая всякой возможности создать надстройку, скажем, для Word. Кстати, именно это ограничение всё время и мотивировало меня найти какую-либо более универсальную технологию для создания надстроек. И такой технологией оказалось VSTO расширение для Microsoft Office.

2. VSTO расширения для Microsoft Office

Что же такое VSTO? VSTO это Visual Studio Tools for Office, то есть это набор инструментов визуальной среды разработки приложений Visual Studio для Office.

Вообще VSTO не является чем-то совсем уж новым, расширения VSTO можно было создавать еще для Office 2013. Но, что важно, не ниже. И это как раз то, что является его довольно большим минусом. Проблема заключается в том, что в организациях, которые когда-то закупили лицензионный Office 2007, он чаще всего так до сих пор и работает. А что, простой, надежный, без лишних прибамбасов, можно сказать на 100% покрывающий все потребности работы с документами, и закупка более новой версии в целом, вроде как и не имеет смысла, можно сказать пустая трата денег. Но вот расширения VSTO на них встанут едва ли, только если может быть с помощью каких-нибудь "костылей". Так что, если появилась потребность в создании собственных надстроек в приложениях Microsoft Office, то это можно считать существенным мотивом к обновлению ПО, если оно не соответствует требованиям.

Как можно понять из названия VSTO, для его создания в первую очередь конечно же нужен Visual Studio,

на данный момент актуальной версией которой является 2019, и его дополнительный инструмент "Разработка надстроек для Office и SharePoint".

Добавляемые при этом в Visual studio дополнительные шаблоны и предоставляют наборы инструментов для создания надстроек к Word, Excel, PowerPoint и многих других приложений Microsoft.

Так же в дальнейшем наверняка понадобится инструмент для установки своих созданных надстроек на другие компьютеры, и для этого подойдет расширение "Microsoft Visual Studio Installer Projects",

которое можно установить с помощью инструмента "управление расширениями".

Надстройку для Office можно создавать как на уровне документа, то есть эта надстройка будет запущена только при открытии конкретного документа, в котором она была создана, так и на уровне приложения, когда надстройка будет запускаться вместе с приложением независимо от открываемого документа.

Принцип создания надстройки для всех приложений (Word, Excel, PowerPoint и т.д.) в общем-то одинаковый. Для начала создаётся некий интерфейс на пользовательскую ленту инструментов, а затем обрабатываются события, инициируемые элементами этого созданного интерфейса, например, нажатие кнопки. Фактически создание надстройки отличаются в основном только объектной моделью приложения, поэтому, прежде чем создавать надстройку, скажем для Word, вначале нужно изучить объектную модель Word, структуру его документа и API, предоставляющий набор методов для работы с ним. Разумеется, то же касается и остальных приложений пакета Microsoft Office.

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

3. Приступаем к разработке надстройки

А теперь пример создания очень простенькой надстройки для Word, которая все что и будет уметь делать, так это вставлять в документ в текущую позицию фразу "Привет Мир!", ну или за место слова "Мир" будет вставляться указанное имя. При этом можно будет оценить преимущества разработки расширений VSTO по отношению к библиотеке Excel-DNA, если Вы читали мою статью об этой библиотеке.

И так, после того как инструмент "Разработка надстроек для Office и SharePoint" будет добавлен в Visual Studio, в нём появятся множество дополнительных шаблонов. Среди этих шаблонов нас в данный момент интересует шаблон "Надстройка VSTO для Word".

Кстати, как можно увидеть на изображении выше, рядом так же находятся шаблоны для создания Документа VSTO для Word, и Шаблона VSTO для Word, которые позволяют соответственно создать конкретный документ Word, расширенный дополнительным функционалом, или шаблон документа, который далее будет генерировать документы Word.

Создадим новый проект надстройки VSTO для Word и назовём его "HelloWoldAddIn", на что в ответ будет получен следующий автоматически сгенерированный код:

Код на C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Word = Microsoft.Office.Interop.Word;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Word;

namespace HelloWoldAddIn
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region Код, автоматически созданный VSTO

        /// <summary>
        /// Требуемый метод для поддержки конструктора — не изменяйте 
        /// содержимое этого метода с помощью редактора кода.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }
        
        #endregion
    }
}

Класс ThisAddIn, который был автоматически создан, является наследником класса Microsoft.Office.Tools.AddInBase, который, в свою очередь, предоставляет доступ к объектной модели текущего приложения посредством поля Application, возвращающего объект, представляющий экземпляр этого приложения.

Изначально в этом классе представлены всего лишь два обработчика событий - ThisAddIn_Startup, выполняющий код при загрузке надстройки и позволяющий произвести какую-либо инициализацию этой надстройки при запуске приложения. И ThisAddIn_Shutdown, который наоборот выполняет код перед закрытием приложения, и позволит сохранить настройки Вашей надстройки.

Но, с помощью только этих двух обработчиков многого не сделаешь, для работы нужна хотя бы одна какая-нибудь кнопка, которую можно было бы нажать в нужный момент работы с документом. И эту кнопку конечно же можно создать на ленте пользовательского интерфейса. Поэтому следующая задача - добавить в проект "Ленту", и чтобы было удобнее её редактировать, стоит выбрать именно ленту в визуальном конструкторе,

после чего, собственно, и появится конструктор вкладки TabAddIns на ленте, пока еще пустой. Эту вкладку представляет класс Ribbon1, который является наследником класса Microsoft.Office.Tools.Ribbon.RibbonBase, который, в свою очередь, представляет базовый класс для настроек ленты Microsoft Office.

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

И вот теперь в надстройке наконец-то появилась такая нужная нам кнопка, которую я назвал "Привет Мир!". Так же, для небольшой демонстрации некоторых возможностей, я сразу же добавил текстовое поле "Имя", из которого будет браться указанное имя для замены слова "Мир" во вставляемой этой надстройкой фразе.

При желании можно изменить имя группы вкладки, я свою группу назвал просто "Моя надстройка", а также можно переименовать саму вкладку, имя по умолчанию которой "TabAddIns". Если оставить имя как есть, то надстройка появиться в ленте на общей вкладке под названием "Надстройки", если же переименовать, то название вкладки, в которой появиться надстройка, соответственно измениться.

Далее эту ленту, а точнее вкладку на ленте, надо добавить к нашей надстройке и сделать это можно в переопределенном методе CreateRibbonExtensibilityObject.

protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
    Ribbon1 ribbon = new Ribbon1();
    return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
        new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
}

И теперь, запустив приложение кнопкой Пуск,

откроется приложение Word, в котором уже можно найти созданную надстройку.

Правда толку от нее мало, кнопка пока что еще не работает. Поэтому, для того чтобы надстройка заработала, осталось на кнопку "Привет мир" добавить какой-нибудь программный код. Для этого находим эту кнопку в конструкторе, и, дважды на неё нажав мышкой, добавляем ей обработчик события, начальный код которого генерируется в классе ленты Ribbon1.

Но далее возникает одна проблемка. Сама лента Ribbon не имеет доступа к Application, и соответственно не может получить экземпляр текущего приложения для работы с ним и его документами. Так что писать код обработчика события нажатия кнопки прямо в классе Ribbon это плохая идея. Но это проблема решается довольно просто - нужно добавить новое событие, например, ButtonClicked, самому классу Ribbon, и при нажатии кнопки на ленте запустить обработчик этого нового события. А сам программный код этого обработчика определить в классе ThisAddIn, который уже вполне имеет доступ к Application. И кроме того, через этот обработчик, основанный на стандартном делегате Action, в класс ThisAddIn можно передать экземпляр текущего класса Ribbon, что позволит получить полноценный доступ к своей вкладке на ленте и всем её компонентам.

    public partial class Ribbon1 {
        public event System.Action<Ribbon1> ButtonClicked;
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e) {
            
        }

        private void btnHelloWorld_Click(object sender, RibbonControlEventArgs e) {
            ButtonClicked?.Invoke(this);
        }
    }
    public partial class ThisAddIn
    {

        . . .

        protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
            Ribbon1 ribbon = new Ribbon1();
            ribbon.ButtonClicked += Ribbon_ButtonClicked;
            return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
                new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
        }

        private void Ribbon_ButtonClicked(Ribbon1 ribbon) {
            // Если в текстовом поле на ленте указано имя, то возьмем его. Иначе имя будет Мир.
            string _name = ribbon.ebHelloWorld.Text == "" ? "Мир" : ribbon.ebHelloWorld.Text;
            // Вставим в текущую позицию текст "Привет" и определенное выше имя.
            Application.Selection.Text = $"Привет {_name}!";
        }
    }

Ну вот надстройка и готова, осталось её запустить, и проверить её работу.

Да, кстати, после того как Вы протестируете надстройку, она останется в приложении Word и после закрытия Visual Studio, что не совсем правильно, так как эта надстройка пока еще только тестовая. Поэтому перед тем как завершить работу в Visual Studio не забудьте очистить собранный проект.

4. Дополнительные возможности надстройки

Надстройки VSTO удобны тем, что они позволяют использовать практически любые библиотеки и возможности NET Framework, версию которой Вы выберите перед началом создания надстройки. А это значит, что при желании Вы можете в документ загрузить какую-нибудь информацию, например, из базы данных или прямо с интернета, можете отправить что-нибудь из документа по электронной почте или даже наоборот получить электронную почту сразу в свой документ.

И конечно же имея такие возможности, наверняка рано или поздно возникнет вопрос с хранением некоторых настроек. Ну, в случае VSTO на уровне документа настройки, наверное, можно было бы хранить прямо в самом документе. В Word это может быть некоторый скрытый текст, с именованной закладкой для быстрого доступа к настройкам. В Excel можно использовать какую-либо ячейку. Но вот в надстройках VSTO на уровне приложения конкретного документа нет. Поэтому в этом случае для хранения настроек подойдёт системный реестр или просто обычный текстовый документ, расположенный, например, в документах текущего пользователя. Вот, как-то так:

Код на C#
public partial class ThisAddIn
{
    const string FILE_NAME = "HelloWordAddIn.txt";
    string name = "";

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        name = LoadName();
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
    }

    #region Код, автоматически созданный VSTO

    /// <summary>
    /// Требуемый метод для поддержки конструктора — не изменяйте 
    /// содержимое этого метода с помощью редактора кода.
    /// </summary>
    private void InternalStartup()
    {
        this.Startup += new System.EventHandler(ThisAddIn_Startup);
        this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
    }

    #endregion

    protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
        Ribbon1 ribbon = new Ribbon1();
        ribbon.ButtonClicked += Ribbon_ButtonClicked;
        return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
            new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
    }

    private void Ribbon_ButtonClicked(Ribbon1 ribbon) {
        // Определим какое имя должно быть указно при нажатии кнопки.
        string _name = 
            ribbon.ebHelloWorld.Text == "" ? (string.IsNullOrEmpty(name) ? "Мир" : name) 
            : ribbon.ebHelloWorld.Text;
        // Вставим в текущую позицию текст "Привет" и определенное выше имя.
        Application.Selection.Text = $"Привет {_name}!";
    }

    /// <summary>
    /// Получает имя из файла в директории "Мои документы"
    /// </summary>
    /// <returns></returns>
    private string LoadName() {
        string _name = "";
        // Для начала надо узнать путь к директорию "Мои документы" 
        // текущего пользователя,
        string myDocuments = 
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        // и сформировать полный путь к текстовому файлу, 
        // в котором должно быть указано имя.
        string path = $@"{myDocuments}\{FILE_NAME}";

        // Если этого файла нет,
        if (!File.Exists(path))
            // то надо его создать, и сразу закрыть.
            File.Create(path).Close();

        try {
            // Далее надо открыть текстовый файл,
            using (StreamReader sr = 
                new StreamReader($@"{myDocuments}\{FILE_NAME}", Encoding.UTF8)) {
                // и считать из него указанное имя.
               _name = sr.ReadLine();
            }
        } catch (FileNotFoundException) {
            // Если во время открытия файла возникла ошибка, 
            // значит пусть имя останется пустым.
            _name = "";
        }
        return _name != null ? _name : "";
    }
}

В этом коде был добавлен метод LoadName, который находит в директории документов пользователя файл "HelloWordAddIn.txt" и считывает из него имя, которое нужно поприветствовать. Чтобы постоянно не обращаться к файлу, имя считывается один раз при запуске настройки из метода ThisAddIn_Startup, и запоминается в глобальной переменной name, к которой уже в любой момент могут обратиться все желающие.

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

Сделать это можно в классе ленты Ribbon в методе Ribbon1_Load, который срабатывает при загрузке ленты в приложении Office. Но делать это прямо в классе ленты опять же будет не целесообразно, так как прямой связи с классом ThisAddIn он не имеет, а ведь именно в нём находятся данные для загрузки имени из файла. Зато есть смысл добавить классу Ribbon ещё одно событие RibbonLoad, обработчик которого будет запускаться при загрузке ленты.

И тогда класс Ribbon примет следующий вид:

    public partial class Ribbon1 {
        public event System.Action<Ribbon1> RibbonLoad;
        public event System.Action<Ribbon1> ButtonClicked;

        private void Ribbon1_Load(object sender, RibbonUIEventArgs e) {
            RibbonLoad?.Invoke(this);
        }

        private void btnHelloWorld_Click(object sender, RibbonControlEventArgs e) {
            ButtonClicked?.Invoke(this);
        }
    }

а в классе ThisAddIn тогда немного изменится метод CreateRibbonExtensibilityObject.

    protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
        Ribbon1 ribbon = new Ribbon1();
        ribbon.RibbonLoad += Ribbon_RibbonLoad;
        ribbon.ButtonClicked += Ribbon_ButtonClicked;
        return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
            new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
    }

В нем добавляется обработчик на новое, только что созданное, событие. И, соответственно, добавиться метод Ribbon_RibbonLoad,

        /// <summary>
        /// Обработка события возникающего при загрузке надстройки на ленте Ribbon
        /// </summary>
        /// <param name="ribbon"></param>
        private void Ribbon_RibbonLoad(Ribbon1 ribbon) {
            ribbon.ebHelloWorld.Text = name;
        }

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

5. Ручная установка надстройки

Теперь, когда надстройка готова, её надо установить. Для того чтобы Microsoft Word увидел и подключил надстройку на другом компьютере, проект надстройки надо собрать уже не в режиме разработки (Debug), а в режиме развертывания (Release). В выходном каталоге, примерно где-то здесь: C:\Users\User\source\repos\HelloWoldAddIn\HelloWoldAddIn\bin\Release, будут скомпилированы несколько файлов. Нас интересуют четыре из них:

  • HelloWoldAddIn.dll
  • HelloWoldAddIn.dll.manifest
  • HelloWoldAddIn.vsto
  • Microsoft.Office.Tools.Common.v4.0.Utilities.dll

Все эти четыре файла нужно скопировать куда-нибудь в одну папку. Но, для того чтобы Word увидел надстройку, нужна еще соответствующая запись в системном реестре. А точнее, в ветке реестра HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins (если приложение Excel, то и ветка соответствующая), нужно добавить раздел нашей надстройки, например, HelloWoldAddIn. В этом разделе нужно создать четыре параметра:

  • строковый параметр "Description"
  • строковый параметр "FriendlyName"
  • параметр DWORD (32 бита) "LoadBehavior"
  • строковый параметр "Manifest"

и заполнить их примерно как указано на изображении ниже.

Параметр "Description" - это понятно, описание надстройки.

Параметр "FriendlyName" - это то, как надстройка будет выглядеть в списке надстроек в приложении Microsoft.

Параметр "LoadBehavior" равный 3 означает, что надстройка включена.

Самый сложный получается параметр "Manifest", тут указан путь к файлам надстройки. Но, надо обязательно учесть, что перед началом пути стоит префикс "file:///", да-да, именно с треся слешами, а в конце пути указан суффикс "|vstolocal" и именно с "пайпом" в начале суффикса. А сам путь должен указывать на конкретный файл с расширением "vsto".

Если Вы все правильно сделаете, то запустив приложение Word, после нескольких предупреждений о нарушении безопасности, на ленте интерфейса Вы увидите свою надстройку. А если зайти в параметры Word, то на вкладке "Надстройки" будет информация о добавленной надстройке.

Так же, если зайти в "Управление надстройками COM", то в списке надстроек будет отображаться Ваша надстройка, которую при желании можно временно отключить, убрав галочку напротив неё.

Если параметры реестра прописаны в ветке "HKEY_CURRENT_USER", то надстройка будет доступна только текущему пользователю Windows, а если те же параметры прописать в ветке "HKEY_LOCAL_MACHINE", то надстройка станет доступна для всех пользователей системы.

6. Установка надстройки с помощью установщика Windows

Но конечно же устанавливать надстройку вручную очень неудобно, поэтому гораздо лучше создать установщик, который всё сделает сам. Поэтому, если Вы все ещё не установили себе расширение "Microsoft Visual Studio Installer Projects", то самое время это сделать.

Далее надо добавить проект установщика (Setup Project) в решение,

после чего сразу откроется вкладка "File System". Если же она не открылась, то открыть её можно самому, нажав правой кнопкой мыши на проекте установщика, и в появившемся меню из "View" выбрать пункт "Файловая система".

Во вкладке файловой системы надо указать, какие файлы нужны для работы. Для этого надо вызвать меню правой кнопкой мыши на разделе "Application Folder", и из пункта "Add" выбрать подпункт "Выходной элемент проекта...".

Появится окно "Добавление выходной группы проекта", в котором надо выбрать пункт "Основные выходные файлы" и нажать кнопку "ОК".

После этого в разделе "Application Folder" появится список файлов. Это и есть те файлы, которые далее будут скопированы в рабочий раздел надстройки, и которые должны отвечать за её работу.

Но этот список надо немного скорректировать, что-то надо в него добавить, а что-то из него удалить. А именно.

В этом списке в данный момент не хватает двух важных файлов манифеста надстройки Word:

  • HelloWoldAddIn.dll.manifest
  • HelloWoldAddIn.vsto

Чтобы их добавить нужно снова вызвать контекстное меню раздела "Application Folder" и из пункта меню "Add" выбрать теперь уже подпункт "Файл...". Откроется окно выбора файлов, в котором надо найти эти файлы манифеста. Найти их можно, как я уже указывал ранее, в выходном каталоге проекта надстройки, примерно где-то здесь: C:\Users\User\source\repos\HelloWoldAddIn\HelloWoldAddIn\bin\Release. Если этот каталог пустой, значит Вы просто забыли собрать проект надстройки в режиме развертывания (Release), сделайте это. А далее надо добавить эти два файла в список выходных файлов.

А теперь в списке ещё остались файлы, которые в рабочем каталоге надстройки совершенно не нужны, их надо исключить из списка выходных файлов. Это удобнее делать из окна "Обозревателя решений". Чтобы исключить файл из списка надо выбрать его в обозревателе, после чего в окне свойств установить значение параметра "Exclude" в True. После этого этот файл в "Обозревателе решений" примет вид как исключённый, а из списка выходных файлов и вовсе исчезнет.

Исключить из списка нужно все файлы из-под раздела обнаруженных зависимостей ("Detected Dependencies"), за исключением платформы "Microsoft .NET Framework" или любой сборки, завершающейся ** *.Utilities.dll**

Должно получиться примерно вот так:

Сразу же можно настроить путь к выходным файлам надстройки. Для этого надо выбрать раздел "Application Folder", после чего в окне свойств в параметре "DefaultLocation" можно будет увидеть шаблон пути: [ProgramFiles64Folder][Manufacturer]\[ProductName].

ProgramFiles64Folder или ProgramFilesFolder означает путь к директорию Program Files, или Program Files (x86), смотря какую платформу Вы выберите, 64-битную или 32-битную.

Параметры "Manufacturer" и "ProductName" - это переменные, которые можно настроить в окне свойств проекта установщика, после того как будет выбран корень проекта "HelloWorldAddInSetup".

Здесь же с помощью параметра "TargetPlatform" выбирается платформа, 64-битная (x64) или 32-битная (x86), это важно и зависит от того, для какого офиса будет устанавливаться надстройка, для 64-битного или 32-битного.

Не менее важным параметром является параметр "Version", который влияет на то, будут ли при переустановке надстройки уже существующие файлы заменены, или будет отображено сообщение, что более новая версия уже установлена. При изменении этого параметра, будет предложено автоматически изменить значение параметра "ProductCode", сформировав новый уникальный код. Ориентируясь на этот код, установщик будет принимать решение, устанавливается ли измененная надстройка или производится попытка ещё раз установить ту же самую надстройку. Если код разный, то далее уже делается проверка номера версии устанавливаемой надстройки, выше она, уже установленной, или ниже.

Так же здесь настраивается переменная "Author", которую тоже можно использовать в шаблоне пути выходных файлов.

Еще полезные параметры, которые будут видны при установке надстройки, это "Description" - описание надстройки и "Title" - всплывающая подсказка к надстройке.

Как можно вспомнить из раздела ручной установки надстройки, для её работы кроме файлов нужна ещё запись в системном реестре. Для программной установки записи в реестр надо правой кнопкой вызвать контекстное меню на заголовке проекта установщика, и далее из меню "View" выбрать подменю "Реестр".

Откроется вкладка Реестра (Registry), в двух ветках которой уже будут начальные записи.

Запись в ветке реестра HKEY_CURRENT_USER означает, что настройка будет установлена только для текущего пользователя. А ветка HKEY_LOCAL_MACHINE - что надстройка будет установлена для всех пользователей операционной системы. Но, в любом случае, начальные записи не верны, поэтому раздел "[Manufacture]" можно смело удалять из обоих веток.

Далее надо решить, будет ли всё-таки устанавливаться надстройка для всех или только для текущего пользователя, и выбрать для дальнейшей работы соответствующую ветку HKEY. В этой ветке к разделу "Software" надо последовательно добавить разделы, чтобы получился следующий путь: HKEY_*\Software\Microsoft\Office\Word\AddIns\Paradox.HelloWorldAddIn. Понятно, что в этом пути Word означает надстройку для приложения Microsoft Word, и если надстройка создается, например, для Excel, то за место Word надо указать Excel. А раздел с именем "Paradox.HelloWorldAddIn" это уже непосредственно сама надстройка и может быть названа как угодно по своему усмотрению, но обычно её имя строится из названия организации или автора и названия надстройки через точку.

После того как путь будет построен, в разделе "Paradox.HelloWorldAddIn" следует создать четыре параметра:

  • строковый параметр "Description"
  • строковый параметр "FriendlyName"
  • параметр DWORD (32 бита) "LoadBehavior"
  • строковый параметр "Manifest"

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

Как можно заметить, в параметре "Manifest", в отличии от ручной настройки, указан не путь к файлам надстройки, а переменная "[TARGETDIR]", которая автоматически выстроит путь к директорию, куда будет установлена надстройка. А какой путь выстроит эта переменная, настраивается в свойствах "Application Folder" вкладки "File System" ("Файловой системы"). По умолчанию это директорий с указанным наименованием организации и наименованием имени продукта в каталоге Program Files или Program Files (x86), в зависимости от того, какая платформа была выбрана.

Ну и в общем-то для сборки установщика почти всё готово. Можно ещё сделать проверку требуемой версии Microsoft .NET Framework. Для этого надо нажать правой кнопкой мыши на заголовке проекта установщика, в нашем случае это HelloWorldAddInSetup, и из контекстного меню выбрать пункт "Свойство", после чего появиться окно страницы свойств установщика.

В этом окне надо нажать кнопку "Предварительные требования" (Prerequisites...), которое откроет окно "Необходимые компоненты", в котором можно выбрать нужную версию .NET Framework, используемую при создании надстройки.

Так как моим приложениям часто приходиться работать на Windows 7, то я обычно рабою с .NET Framework версии 4.5.2.

Microsoft также при создании установщика для надстроек VSTO рекомендует настроить условия запуска для обнаружения среды выполнения VSTO. Но, для непосредственной установки надстройки, это не обязательно, если Вам будет интересно, то дополнительную информацию по настройке установщика можно найти на официальном сайте Microsoft. А без этих проверок надстройка после установки просто либо заработает, если у Вас Office 2013 или выше, или не заработает, если у Вас соответственно Office ниже версии 2013.

Всё, теперь надо убедиться, что режим компиляции установлен как Release и пересобрать проект установщика. В выходном каталоге проекта установщика надстройки будут созданы два файла - HelloWorldAddInSetup.msi и setup.exe, для установки надстройки можно использовать любой из них. Устанавливаем, запускаем Word и пользуемся.

к началу статьи
0 171 0
Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам улучшить сервис для Вас с целью персонализации сервисов и предложений. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Продолжая пользоваться сайтом без изменения настроек, вы даёте согласие на использование ваших cookie-файлов.