Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Все статьи »

Обсудить на форуме Обсудить на форуме

Visual Studio Tools for Office
В данном документе содержится информация о том, как применять новые шаблоны проектов Microsoft Visual Studio .NET 2003 для создания решений, использующих Microsoft Office Excel 2003 и Microsoft Office Word 2003. Включено пошаговое описание установки продукта и создания новых проектов, а также обсуждаются вопросы развертывания, безопасности и совместной работой над проектами. (20 печатных страниц).
Относится к:
Microsoft® "Visual Studio Tools for Office"
Microsoft Office 2003
Microsoft Visual Studio® .NET 2003

Резюме: В данном документе содержится информация о том, как применять новые шаблоны проектов Microsoft Visual Studio .NET 2003 для создания решений, использующих Microsoft Office Excel 2003 и Microsoft Office Word 2003. Включено пошаговое описание установки продукта и создания новых проектов, а также обсуждаются вопросы развертывания, безопасности и совместной работой над проектами. (20 печатных страниц).

Содержание

Знакомство с "Visual Studio Tools for Office"

Microsoft® "Visual Studio Tools for Office" предлагает новый набор шаблонов проектов Visual Studio® .NET 2003, которые вы можете применять для создания сборок, работающих в рамках процессов Microsoft Office Excel 2003 и Microsoft Office Word 2003. Это позволяет вам создавать документо-центричные решения, использующие всю мощь базовых приложений (в первой версии продукта это Excel и Word). При помощи Microsoft Visual Basic® .NET или Microsoft Visual C#® вы создаете сборки, которые выполняются под управлением общей языковой среды выполнения. Такой код часто называют управляемым кодом. Для сравнения, существующие приложения Visual Basic for Applications (VBA) или код на базе COM называют неуправляемым кодом.

Общая языковая среда выполнения управляет распределением памяти и следит, чтобы ваш код не пытался выполнять запрещенные операции, например, обращаться к памяти, которая ему не принадлежит. Кроме того, среда выполнения обеспечивает доступ к Microsoft .NET Framework и библиотекам базовых классов. При помощи этих инструментов вы можете, к примеру, создать систему управления документооборотом, которая проверяет документы на юридическую правильность. Или же вы можете создать решение для прогнозирования продаж, использующее Excel в качестве интерфейса пользователя и автоматически вносящее изменения в центральную базу данных при изменении прогнозов. Только ваше собственное воображение может ограничить возможности для творчества, предоставляемые богатыми объектными моделями Excel и Word в сочетании с вашим собственным кодом и обширными библиотеками .NET Framework.

Хотя с помощью управляемого кода можно обеспечить автоматизацию операций в Excel или Word, выполнение этой задачи требует наличия внешнего приложения, извне управляющего определенным приложением Office. Сборки, созданные с помощью "Visual Studio Tools for Office", позволяют управляемому коду взаимодействовать с базовым приложением на более тонком уровне. COM-расширения можно создавать с использованием управляемого кода, однако новая архитектура "Visual Studio Tools for Office" позволяет разрабатывать решения, которые тесно интегрированы и, что еще более важно, специально ориентированы на использование управляемого кода.

Установка "Visual Studio Tools for Office"

Перед установкой "Visual Studio Tools for Office" следует установить Microsoft Office Excel 2003 и/или Microsoft Office Word 2003. Во время установки Office не забудьте отметить опции поддержки .NET в Word and Excel. Это обеспечивает установку соответствующих основных сборок взаимодействия (PIA), требуемых для доступа к Office из Visual Studio .NET. При полной установке Office необходимые компоненты устанавливаются автоматически. После завершения установки "Visual Studio Tools for Office" для разработчика при следующем запуске Visual Studio .NET станут доступны новые типы проектов.

Совет. Основные сборки взаимодействия позволяют управляемому коду Visual Basic .NET и Visual C# .NET работать с объектной COM-моделью базового приложения.

Порядок установки

Важно соблюдать правильный порядок установки. На компьютере разработчика сначала следует установить Visual Studio .NET 2003 Professional или выше. В ходе установки Visual Studio устанавливается Microsoft .NET Framework версии 1.1. Архитектура .NET Framework должна быть установлена перед Office 2003, чтобы обеспечить доступ к глобальному кэшу сборок (GAC). Программа установки Office устанавливает в глобальный кэш сборки PIA для приложений Office, включая необходимые PIA Word и Excel. Таким образом, при установке следует придерживаться следующего порядка:

  • Microsoft Visual Studio .NET 2003
  • Microsoft Office 2003
  • "Visual Studio Tools for Office"

При установке Office 2003 необходимо выбрать варианты полной или выборочной установки. Если вы остановитесь на выборочной установке, отметьте опцию .NET Programmability Support для Excel и/или Word. Кроме того, отметьте .NET Programmability Support в разделе Office Tools для компонентов Microsoft Forms 2.0 и Microsoft Graph.

Для развертывания решения "Visual Studio Tools for Office" на компьютере конечного пользователя вы должны установить следующее:

  • Microsoft .NET Framework 1.1.
  • Microsoft Office Excel 2003 и/или Microsoft Office Word 2003, включая необходимые основные сборки взаимодействия.

Установить .NET Framework конечным пользователям можно при помощи Windows Update, собственной службы Software Update Service вашего домена или специально созданной вами программы установки.

Создание решения "Visual Studio Tools for Office"

Создать решение "Visual Studio Tools for Office" очень легко. В Visual Studio .NET 2003 выберите опцию New Project из меню File. Выберите папку Microsoft Office System Projects; укажите управляемый язык (Visual Basic или C#), а затем один из трех возможных шаблонов: Excel Workbook, Word Document или Word Template.

Выбрав проект, задайте для него имя и путь и нажмите ОК. Запустится мастер проектов Microsoft Office Project Wizard. Мастер предложит вам на выбор: создать новый документ или добавить новую сборку к существующему документу. Кроме того, мастер предполагает, что вы захотите модифицировать настройки политики безопасности доступа к коду Code Access Security (CAS) и разрешить для вашей учетной записи выполнение или отладку новых решений. Вы можете изменить эту установку, но в большинстве случаев лучше этого не делать.

Предупреждение. Если не дать мастеру изменить настройки политики безопасности, вы не сможете запускать или отлаживать решение до тех пор, пока изменения в политику CAS не будут внесены вручную. Мастер выдаст предупреждение, если вы снимете флажок Update local security policy to enable assembly to execute.

После нажатия на кнопку ОК мастер создает новое решение Visual Studio .NET, в котором содержится единственный проект Class Library. Если вы не хотите воспользоваться существующим документом, а решите создать новый, то, в качестве одного из шагов процесса создания проекта мастер создает экземпляр базового приложения. Проект содержит два исходных файла: AssemblyInfo.vb или AssemblyInfo.cs (в зависимости от выбранного вами языка) и файл с классом, который соответствует документу Office, например, ThisWorkbook.vb или ThisWorkbook.cs. Кроме того, в проекте создаются ссылки на необходимые библиотеки, чтобы ваш код мог взаимодействовать с выбранным базовым приложением Office. Если вы добавите к своему проекту Windows Form, создается дополнительная ссылка на библиотеку System.Drawing.dll. Естественно, если ваше приложение того потребует, вы можете добавлять ссылки на дополнительные сборки.

Базовая архитектура проста. При загрузке документа Excel 2003 и Word 2003 проверяют два его специальных свойства: _AssemblyLocation0 и _AssemblyName0. Если эти значения найдены, базовое приложение загружает загрузчик сборок "Visual Studio Tools for Office" (Otkloadr.dll). Эта неуправляемая DLL отвечает за загрузку сборок, созданных с использованием "Visual Studio Tools for Office". Загрузчик использует специальные свойства документа, чтобы найти необходимую сборку для документа, загружает ее в память, проверяет некоторые метаданные, устанавливает ссылки между базовым документом и сборкой и далее не вмешивается.

 

Предупреждение. К базовому документу может быть напрямую привязана только одна управляемая сборка. Хотя эта связанная с документом сборка может ссылаться на любое количество других управляемых сборок, загрузчик "Visual Studio Tools for Office" выдаст сообщение об ошибке, если встретит больше одного набора свойств, указывающих на несколько сборок.

Если вы внимательно посмотрите на свое первое решение "Visual Studio Tools for Office", то заметите, что файл ThisWorkbook.vb содержит единственный класс с именем OfficeCodeBehind, к рассмотрению которого мы обратимся ниже. Основной принцип прост: после загрузки сборки загрузчик "Visual Studio Tools for Office" создает экземпляр класса OfficeCodeBehind. Загрузчик использует атрибут уровня сборки под названием System.ComponentModel.DescriptionAttribute, чтобы найти стартовый класс.

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

Что вы можете делать?

Пусть это звучит избито, но вы ограничены только собственным воображением. С помощью "Visual Studio Tools for Office" вы можете использовать всю мощь механизмов вычислений и создания диаграмм Excel и возможностей Word по обработке документов, а также интегрировать собственную логику приложений в привычный пользователю интерфейс.

Отклик на события

Как уже упоминалось ранее, загрузчик "Visual Studio Tools for Office" связывает экземпляр вашего поддерживающего класса (code-behind) с базовым приложением, используя хорошо известную точку входа под названием _Startup. При вызове процедуры ей передается два параметра. Первый из них - это ссылка по значению на базовое приложение (Excel.Application либо Word.Application), имеющая тип System.Object. Второй параметр - ссылка по значению на базовый документ (Excel.Workbook либо Word.Document), также имеющая тип System.Object. Обе ссылки присваиваются переменным уровня модуля со строгим типом: ThisApplication для базового приложения и ThisWorkbook или ThisDocument для документа.

В Visual Basic обе переменные (ThisApplication и ThisWorkbook либо ThisDocument) определяются с использованием области действия Friend и зарезервированного слова WithEvents. Сгенерированный код в _Startup присваивает параметры с помощью CType. Тем самым ссылки на приложение и электронную таблицу/документ сохраняются для последующего использования, а также привязываются обработчики событий. В Visual C# процесс протекает аналогично. Объектные переменные хранятся как внутренние члены класса. Кроме того, события привязываются вручную с использованием делегирования, поскольку C# не обладает функцией, которая соответствовала бы оператору Visual Basic WithEvents.

Вне зависимости от синтаксиса языка конечный результат один и тот же. Ваш поддерживающий класс обладает стандартным набором готовых событий. Впоследствии вы легко можете добавлять другие события. По умолчанию поддерживающий класс для Excel определяет процедуры-заглушки для событий Open и BeforeClose рабочей книги Excel. Проекты документов Word содержат события Open и Close, а проекты шаблонов Word содержат три события, относящиеся к документу: New, Open и Close. Каждый из этих объектов обладает дополнительными событиями, которые вы можете привязать либо в момент разработки, либо позднее во время выполнения - динамически. Используйте браузер объектов Visual Studio, чтобы увидеть, какие события доступны для определенного объекта. Затем воспользуйтесь документацией "Visual Studio Tools for Office", чтобы получить более подробную информацию о событиях и их работе.

Использование панелей команд

Хотя привязывание кода к событиям базового приложения или документа может быть очень полезным, иногда вам нужно, чтобы управляемый код выполнялся при нажатии пользователем кнопки на панели инструментов. В Office панели инструментов называются панелями команд и представляют собой общее средство для всех приложений. В некоторых случаях вы можете решить создать собственную панель команд со своими кнопками, а в других случаях нужно просто добавить управляющий элемент к существующей панели команд или меню. При помощи Visual Studio Tools for Office" вы можете сделать и то, и другое.

Добавление новой строки меню в Excel осуществляется за несколько простых шагов. Во-первых, нужно дать пространству имен Microsoft.Office.Core какой-то более простой псевдоним, например, Office:

´ Visual Basic
´ В начале ThisWorkbook.vb.
Imports Office = Microsoft.Office.Core

// C#
// В начале ThisWorkbook.cs.
using Office = Microsoft.Office.Core;

Затем вам потребуется три переменных уровня модуля: одна для ссылки на главную строку меню Excel, еще одна для элемента строки меню, и одна для того самого пункта меню, событие Click на котором вам нужно обрабатывать.

´ Visual Basic
´ В секции объявлений класса OfficeCodeBehind.
Private MainMenuBar As Office.CommandBar
Private MenuBarItem As Office.CommandBarControl
Private WithEvents MenuItem As Office.CommandBarButton

// C#
// В секции объявлений класса OfficeCodeBehind.
private Office.CommandBar MainMenuBar;
private Office.CommandBarControl MenuBarItem;
private Office.CommandBarButton MenuItem;

Когда переменные определены, вам потребуется написать две процедуры - одну для создания специального пункта строки меню, другую для создания пункта меню. Пример первой процедуры приведен ниже:

´ Visual Basic
Private Sub InitMenuBarItems(ByVal Caption As String)
    Try
        Me.MainMenuBar = ThisApplication.CommandBars( _
            "Worksheet Menu Bar")
        Me.MenuBarItem = Me.MainMenuBar.Controls.Add( _
            Office.MsoControlType.msoControlPopup, Temporary:=True)

        Dim cbc As Office.CommandBarControl
        cbc = DirectCast(Me.MenuBarItem, Office.CommandBarControl)
        cbc.Caption = Caption
        cbc.Visible = True

    Catch ex As Exception
        MessageBox.Show(ex.Message, _
            ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try
End Sub

// C#
private void InitMenuBarItems(string Caption) 
{
    try 
    {
        this.MainMenuBar = ThisApplication.CommandBars[
            "Worksheet Menu Bar"];
        this.MenuBarItem = this.MainMenuBar.Controls.Add(
            Office.MsoControlType.msoControlPopup, Type.Missing, 
            Type.Missing ,Type.Missing, true);

    Office.CommandBarControl cbc = 
        (Office.CommandBarControl) this.MenuBarItem;
        cbc.Caption = Caption;
        cbc.Visible = true;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, 
            MessageBoxIcon.Error);
    }
}

Совет. Этот пример демонстрирует одно из множества отличий между кодом Visual Basic и кодом С# при работе с объектными моделями Office. Многие элементы объектных моделей Excel и Word могут получать необязательные параметры. Если Visual Basic обрабатывает их так же, как VBA, то C# не обладает такими возможностями. Для необязательных параметров, передаваемых по ссылке, вы можете передать в C# объект Type.Missing. Для параметров, передаваемых по значению, вы должны при вызове методов с необязательными параметрами из C# указать значения по умолчанию.

В большинстве случаев вы будете вызывать эту процедуру из обработчика событий ThisWorkbook_Open, который заранее определен в вашем классе OfficeCodeBehind. Создав пункт строки меню, для создания нового пункта меню можно использовать, например следующий код:

´ Visual Basic
Private Function CreateButton( _
    ByVal Parent As Office.CommandBarPopup, _
    ByVal Caption As String) As Office.CommandBarButton

  Dim cbc As Office.CommandBarControl
    Try
        cbc = Parent.Controls.Add( _
         Office.MsoControlType.msoControlButton, Temporary:=True)
        cbc.Caption = Caption
        cbc.Visible = True

  Catch ex As Exception
    MessageBox.Show(ex.Message, _
        ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error)
  End Try

  Return DirectCast(cbc, Office.CommandBarButton)
End Function

// C#
private Office.CommandBarButton CreateButton(
  Office.CommandBarPopup Parent, string Caption) 
{
  Office.CommandBarControl cbc = null;
  try 
  {
    cbc = Parent.Controls.
        Add(Office.MsoControlType.msoControlButton, 
        Type.Missing, Type.Missing, Type.Missing, true);
    cbc.Caption = Caption;
    cbc.Visible = true;

  } 
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, 
        MessageBoxIcon.Error);
  }
  return (Office.CommandBarButton)cbc;
}

Затем вы можете вызвать вышеупомянутые процедуры из события ThisWorkbook_Open, как показано в следующем фрагменте:

´ Visual Basic
InitMenuBarItems("&Travel Tools")
Me.MenuItem = Me.CreateButton( _
 DirectCast(Me.MenuBarItem, Office.CommandBarPopup), _
 "&Create Expense Report")

// C#
InitMenuBarItems("&Travel Tools");
this.MenuItem = this.CreateButton(
  (Office.CommandBarPopup)this.MenuBarItem, 
  "&Create Expense Report");
this.MenuItem.Click += 
  new Office._CommandBarButtonEvents_ClickEventHandler(
  MenuItem_Click);

И наконец, добавим код, выполняющийся при выборе пользователем нового пункта меню. Ниже приводится пример, где вызывается Windows Form в диалоговом режиме.

´ Visual Basic
Private Sub MenuItem_Click( _
 ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, _
 ByRef CancelDefault As Boolean) Handles MenuItem.Click
    Dim frm As New frmExpReport
    Select Case frm.ShowDialog
        Case DialogResult.OK
        ´ Создать отчет.
        Case DialogResult.Cancel
        ´ Не делать ничего.
    End Select
    frm.Close()
    frm.Dispose()
End Sub

// C#
private void MenuItem_Click(Office.CommandBarButton Ctrl, 
  ref bool CancelDefault) 
{
  frmReport frm = new frmReport();
  switch (frm.ShowDialog())
  {
    case DialogResult.OK:
        // Создать отчет.
        break;

    case DialogResult.Cancel:
        // Не делать ничего.
        break;
  }
  frm.Close();
  frm.Dispose();
}

Использование VBA-объектов в документах

Панели команд позволяют обрабатывать вызываемые пользователем события без внесения изменений в структуру документа. Электронные таблицы Excel и документы Word дают пользователю (и разработчику) возможность добавлять VBA-объекты (например, командные кнопки и поля списка) прямо в тело электронной таблицы или документа (см. Рисунок 1). Код может работать с этими управляющими элементами и реагировать на вызываемые ими события.

Рисунок 1. Объект VBA размещен в таблице Excel.

Для работы с управляющими элементами VBA из управляемого кода вы должны определить ссылку на объект соответствующего типа. В решении "Visual Studio Tools for Office" определения этих объектов по умолчанию недоступны. Чтобы использовать их, вам необходимо сослаться на PIA для Microsoft Forms 2.0. Вы сможете найти PIA, воспользовавшись диалоговым окном Add Reference. Библиотека типов Microsoft Forms 2.0 Object Library находится на вкладке СОM диалогового окна Add Reference. Добавление библиотеки типов устанавливает связь с PIA из GAC, так что Visual Studio .NET нет необходимости генерировать стандартную сборку взаимодействия. Установив ссылку на библиотеку, вам скорее всего потребуется добавить оператор imports/using уровня модуля, чтобы создать псевдоним для дополнительных пространств имен, доступных в PIA. Например, если вы хотите определить переменную командной кнопки, можно сначала добавить следующий псевдоним, чтобы избежать ввода полной ссылки на пространство имен:

´ Visual Basic
Imports MSForms = Microsoft.Vbe.Interop.Forms

// C#
using MSForms = Microsoft.Vbe.Interop.Forms;

Этот псевдоним позволяет вам использовать такую ссылку:

´ Visual Basic
Dim btn As MSForms.CommandButton
´ Вместо:
´ Dim btn As Microsoft.Vbe.Interop.Forms.CommandButton

// C#
MSForms.CommandButton btn;
// Вместо:
Microsoft.Vbe.Interop.Forms.CommandButton btn;

Совет. При создании решений Office избегайте использования операторов Imports или using без псевдонима. Модуль Microsoft Forms включает множество интерфейсов, использующих те же имена классов, что и управляющие элементы в пространстве имен System.Windows.Forms; например, в обеих библиотеках присутствуют классы ComboBox и ListBox.

Развертывание

"Visual Studio Tools for Office" позволяет вам автоматически развертывать код вместе с определенным документом. Когда вы первоначально создаете решение "Visual Studio Tools for Office", расширенные свойства документа указывают на скомпилированную сборку с использованием относительного пути, который состоит из имени документа и суффикса _bin. Например, если ваш проект назван ExcelEvents, сборка получит имя ExcelEvents.dll и будет находиться в папке ExcelEvents_bin.

Решения "Visual Studio Tools for Office" состоят из двух файлов: файла документа и сборки. Существует три основных сценария развертывания, причем каждый из них предполагает, что .NET Framework 1.1 и Office 2003 уже установлены на компьютере пользователя. В первом сценарии, который во многих случаях предпочтителен, файл документа расположен на локальном жестком диске пользователя, а сборка хранится на совместно используемом сетевом ресурсе, доступ к которому осуществляется по UNC или HTTP/S. Во втором сценарии оба файла располагаются на жестком диске пользователя, а в третьем они находятся на сетевом ресурсе. У каждого из сценариев есть свои плюсы и минусы.

Размещение документа непосредственно на компьютере пользователя, а сборки - на удаленном ресурсе дает пользователю личную копию данных (документа), а также доступ к самым последним версиям программных компонентов. Кроме того, поскольку среда выполнения .NET поддерживает работу в офлайновом режиме, мобильные пользователи могут работать со своими приложениями, находясь вне офиса. Недостаток этого способа в том, что пользователю приходится помнить о необходимости хотя бы один раз открыть документ при наличии подключения к сети, чтобы загрузчик мог сохранить сборку в загрузочном кэше пользователя.

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

Предоставление пользователю доступа к документу и сборке, расположенным на централизованном сетевом ресурсе, является неплохим решением в случае, если пользователь постоянно подключен к сети. При этом группа пользователей сможет реализовать возможности сотрудничества, предоставляемые Excel и Word. Любые изменения в документе или сборках будут доступны пользователям немедленно.

Вне зависимости от выбранного сценария вам потребуется внести изменения в локальную политику безопасности на системе пользователя. Чтобы обезопасить пользователей от присоединенных к документу вредоносных кодов, загрузчик "Visual Studio Tools for Office" требует, чтобы сборка была указана как доверенная в локальной политике безопасности. Когда вы первоначально создаете решение "Visual Studio Tools for Office", Visual Studio .NET вносит изменения в политику безопасности на вашем компьютере, чтобы обеспечить разработку и отладку. От вас потребуется модифицировать настройки пользователя с учетом выбранной модели развертывания.

Безопасность

Перед загрузкой любого управляемого кода загрузчик "Visual Studio Tools for Office" проверяет локальную политику безопасности, чтобы установить, был ли сборке, на которую ссылается документ, присвоен статус Full Trust.

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

Когда код загружен, общая языковая среда выполнения собирает сведения о нем. Сведения бывают двух видов: сведения, относящиеся к хосту (например, откуда получен код), и сведения, относящиеся к сборке (например, имеет ли она криптографическую подпись). Сведения соотносятся с определенной политикой. Существует четыре политики: Machine, User, Enterprise и Host. Каждая политика может содержать одну, несколько или ни одной кодовой группы. Кодовые группы на основе сведений устанавливают наборы прав, которые включают одно или более разрешений. Разрешение - это право что-то сделать, например, право на чтение файла с диска. Используя собранные сведения, среда выполнения соотносит сборку с кодовой группой, которая в свою очередь соотносит ее с пересечением прав для всех четырех политик. Тем самым определяется, разрешено ли коду выполнение, и если да, то что он вправе делать.

Сборки, используемые документами Word 2003 или Excel 2003, требуют статуса Full Trust независимо от выбранной вами модели развертывания. Как правило, вы должны будете предоставить право на исполнение определенным местам расположения сборок, а затем присвоить статус доверия определенной сборке или набору сборок на основе строгого имени.

Что происходит внутри

На этом этапе вы уже должны хорошо представлять, что представляет собой решение "Visual Studio Tools for Office" и что вы можете сделать. При более глубоком взгляде на архитектуру "Visual Studio Tools for Office" становится очевидно, что создаваемые вами решения документо-центричны. Если COM-расширения обеспечивают связанные с базовым приложением решения, которые могут выполняться поверх документов, то задача решения "Visual Studio Tools for Office" - исполнение специального кода в контексте определенного документа (или шаблона в случае Word 2003).

Когда вы начинаете создавать решение "Visual Studio Tools for Office", мастер создает решение и проект с выбранным вами именем. Новая возможность Visual Studio .NET 2003 - это возможность давать решению и папке имя, отличное от имени вашего проекта. Эта функция поддерживается мастером создания новых проектов "Visual Studio Tools for Office".

При запуске мастера вы увидите группу параметров безопасности (Security Settings). В большинстве случаев у вас не возникнет необходимости изменять настройки на этой странице мастера. Если вы снимите флажок "Update local security policy to enable assembly to execute", появится предупреждение. Проигнорировав его, вы сделаете невозможным запуск и отладку решения.

Так за что же отвечает этот маленький флажок? Мастер не изменяет политику безопасности во время создания проекта. Вместо этого он ждет, пока вы хотя бы один раз не запустите компиляцию и отладку проекта. Если в вашем решении Visual Studio .NET имеется несколько проектов "Visual Studio Tools for Office", то в политику безопасности компьютера будут помещены только записи кодовых групп проектов, отладка которых выполнялась хотя бы один раз. Во время компиляции "Visual Studio Tools for Office" модифицирует вашу политику пользователя, включая новую кодовую группу под названием Office_Projects (см. Рисунок 2).

Рисунок 2. Утилита.NET Configuration 1.1 с кодовой группой Office_Projects.

Для условия членства в кодовой группе Office_Projects установлено значение All Code, а для набора прав - значение Nothing (см. Рисунок 3). Если вы раскроете кодовую группу Office_Projects, то обнаружите раздел, имя которого совпадает с URL. В качестве условия членства выбрано URL. Указанный URL представляет собой путь, откуда будет выполняться ваша сборка, а имя специального bin-каталога, созданного во время компиляции, состоит из имени проекта с суффиксом _bin. Такой код дает право на исполнение всем сборкам в каталоге.

Рисунок 3. Набор прав Office_Projects.

Наконец, у последней дочерней кодовой группы имя совпадает с полным URL вашей сборки. Эта дочерняя группа также использует URL в качестве условия членства. Для условия членства этой дочерней группы указан полный путь к сборке (включая ее имя). В наборе прав задано Full Trust (см. Рисунок 4).

Рисунок 4. Управляемая сборка с набором прав FullTrust.

После создания проекта вы увидите файл кода ThisDocument или ThisWorkbook с расширением, соответствующим выбранному вами языку. Независимо от языка или типа проекта у вас будет один класс с именем OfficeCodeBehind. Этот класс включает методы _AssemblyLocation0 и _AssemblyName0, которые загрузчик "Visual Studio Tools for Office" будет искать при загрузке или выгрузке вашего кода.

По умолчанию при запуске базового приложения в процесс не загружаются ни загрузчик "Visual Studio Tools for Office", ни общая языковая среда выполнения. Когда пользователь открывает документ, содержащий специальные свойства документа, в память помещается загрузчик "Visual Studio Tools for Office". Он загружает в память среду выполнения и выделяет домен приложения (AppDomain) по умолчанию. После этого среда выполнения будет выгружена только при завершении базового процесса. Первый домен приложения получает имя WRDomainSetup и используется для установки всех будущих доменов. Одновременно с загрузкой среды выполнения создается второй домен приложения. Ему присваивается имя, соответствующее имени вашего документа.

Интересная особенность реализации состоит в том, что для свойства домена приложения SetupInfomation.ShadowCopyFiles установлено значение True. Сборка, загруженная при помощи загрузчика "Visual Studio Tools for Office" с жесткого диска, обрабатывается точно также, как сборка, полученная с удаленного URL. Загружаемые "Visual Studio Tools for Office" сборки копируются в теневой (shadow) каталог, являющийся частью кэша загрузки сборок пользователя, зарегистрированного в данный момент в системе. Вы можете изучить содержимое кэша загрузки, зайдя в соответствующую папку Windows при помощи Windows Explorer. Оказавшись там, откройте папку Assembly и щелкните на значке "+" рядом с ней. Откроется подпапка под именем Download.

Вы должны увидеть совокупность множества папок из папки Documents and Settings с разбивкой по пользователям. Перед загрузкой сборки ее копия делается и помещается в кэш загрузки пользователя, если имеющаяся в кэше версия старше. Вы можете проверить происхождение копии, получив значение свойства сборки CodeBase во время выполнения вашего кода. Свойство сборки Location укажет вам, где эта сборка находится в действительности.

Совет. Возможно, вы захотите управлять кэшем загрузки. Первое, что нужно сделать в таком случае - это присвоить номеру версии сборки статическое значение (этот параметр устанавливается изменением атрибута AssemblyVersion в файле AssemblyInfo). По умолчанию при каждой компиляции и отладке вы будете получать новый номер версии. Фактически это означает, что новая версия будет помещаться в кэш загрузки без удаления предыдущих версий. Вам нужно будет вручную удалять старые версии из кэша при помощи утилиты командной строки Gacutil.exe с параметром /CDL. Кроме того, кэш загрузки у каждого пользователя свой. Очистка вашего кэша никак не повлияет на кэши других пользователей того же компьютера.

Загрузив скопированную версию сборки, вы можете обновить первоначальную версию, чтобы при следующей загрузке документа использовалась самая свежая версия. Фактически, поскольку скопированная версия находится в памяти, пользователю не нужно прерывать работу с базовым приложением или документом.

После загрузки сборки загрузчик "Visual Studio Tools for Office" считывает атрибут уровня сборки с именем System.ComponentModel.DescriptionAttribute. Описание этого атрибута содержит полностью определенное имя типа стартового класса, а также номер версии средств "Visual Studio Tools for Office", при помощи которой был создан проект. В этой первой версии системы номер версии игнорируется, однако он должен присутствовать, иначе процесс загрузки завершится неудачно. Используя имя класса, загрузчик "Visual Studio Tools for Office" создает экземпляр класса, указанного в атрибуте.

Класс OfficeCodeBehind

Независимо от языка или типа документа каждый проект "Visual Studio Tools for Office" содержит конструктор по умолчанию и четыре метода в свернутой области, помеченной Generated initialization code. Конструктор по умолчанию пуст и может быть удален, если он вам не нужен. Указанные четыре метода - это _Startup, _Shutdown и две перегруженные версии FindControl. _Startup используется для привязывания переменных уровня модуля, представляющих базовое приложение и документ, связанный со сборкой. _Shutdown просто обнуляет ссылки на объектные переменные приложения и документа, привязанные в _Startup. Оба этих метода требуются для нормального функционирования проектов "Visual Studio Tools for Office".

Метод FindControl используется для поиска управляющих элементов OLE, расположенных в текущем базовом документе. Малоизвестная функция Excel и Word позволяет помещать элементы управления VBA прямо в тело электронной таблицы или документа. Это можно сделать при помощи панели инструментов Control Toolbox. Открыв эту панель, вы можете с ее помощью размещать управляющие элементы в документе. На Рисунке 5 показаны панель Control Toolbox в режиме конструктора Microsoft Office Word и новая командная кнопка в теле текущего документа.

Рисунок 5. Control Toolbox в Word и новая командная кнопка в теле документа.

Используя метод FindControl, вы можете найти элемент управления, изменять его свойства, выполнять методы и написать код для реакции на связанные с ним события (например, на нажатие командной кнопки). Вне зависимости от базового приложения FindControl получает в виде строки имя управляющего элемента, который вы хотите найти, и при успешном завершении операции возвращает ссылку на System.Object. Вы должны всегда проверять, инициализирован ли возвращенный FindControl объект, поскольку метод игнорирует любые исключения, возникающие при поиске управляющего элемента.

Первая версия FindControl передает настоящую работу второй перегруженной версии, которая получает имя элемента в качестве первого параметра и ссылку на базовый документ в качестве второго. Вторая версия FindControl принимает переменную определенного типа, соответствующую типу проекта, с которым вы работаете (Word или Excel). Более простая версия FindControl всегда передает документ или рабочую книгу, хранящуюся на уровне модуля в переменных ThisDocument или ThisWorkbook. Если вам не нравится, что FindControl игнорирует исключительные ситуации, вы можете модифицировать код, хотя делать это не рекомендуется, поскольку вам придется изменять FindControl во всех проектах и другие разработчики столкнутся с неожиданным для них поведением этого метода.

Кроме вышеупомянутых методов существуют еще обработчики событий, уникальные для базового документа.

Порядок событий

В начале создания экземпляра класса OfficeCodeBehind первым вызывается конструктор по умолчанию. Хотя вы можете добавлять дополнительные конструкторы, в настоящее время отсутствует способ, которым загрузчик "Visual Studio Tools for Office" мог бы их выполнить. После создания экземпляра класса выполняется процедура _Startup. Важно отметить, что код получит доступ к базовому приложению или документу только после ее выполнения. Когда процедура _Startup выполнена, сработают выбранные вами события приложения и документа. Набор выполняемых обработчиков событий зависит от того, за какими событиями вы следите.

Когда пользователь закрывает документ, происходят дополнительные события. Во первых, срабатывают все события базового приложения или документа, связанные с закрытием документа или выходом из приложения. После этого вызывается метод _Shutdown, отсоединяющий код от приложения и документа. Затем выполняется код обработчика событий DomainUnload домена приложения. После этого объект будет уничтожен в ходе работы системы сборки мусора.

Предупреждение. Порядок выполнения обработчиков событий в коде VBA и управляемом коде не детерминирован. Хотя эмпирический опыт показывает, что сначала срабатывают обработчики VBA, а затем управляемые обработчики событий, нет никакой гарантии, что так будет происходить всегда. Поэтому следует стараться использовать только обработчики событий одного типа: управляемые обработчики событий или обработчики событий VBA, но не оба типа вместе. Кроме того, некоторые события поддерживают аргументы отмены, имеющие тип Boolean. Код VBA может отменить событие (например, процесс закрытия рабочей книги). Такие параметры существуют и в управляемом обработчике событий, однако изменение аргумента не возымеет никакого эффекта. Кроме того, даже если код VBA отменит событие закрытия, управляемое событие BeforeClose все равно произойдет, хотя класс не будет уничтожен. Фактически управляемый обработчик событий BeforeClose будет выполняться столько раз, сколько потребуется, пока рабочая книга не будет действительно закрыта!

О пространствах имен и названиях проектов

Когда вы начинаете создавать решение "Visual Studio Tools for Office", имя проекта используется также и в качестве имени для корневого пространства имен. В проектах Visual Basic это можно увидеть в окне свойств проекта. Все дополнительные типы, добавляемые в ваш проект, становятся частью этого пространства имен.

Проекты Visual C#, с другой стороны, просто указывают пространство имен непосредственно в исходных файлах ThisWorkbook.cs или ThisDocument.cs с использованием оператора namespace. В любом случае, если вы решите изменить пространство имен, в котором находится класс OfficeCodeBehind, вам необходимо будет изменить пространство имен в атрибуте уровня сборки System.ComponentModel.DescriptionAttribute. В нем хранится полностью определенное имя типа класса OfficeCodeBehind.

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

Совместное использование проектов "Visual Studio Tools for Office"

Работу над проектом редко ведет один человек. Во множестве случаев вам потребуется возможность совместной работы над проектом одновременно с другим разработчиком. Сейчас вы уже понимаете, что другим разработчикам нужно определить кодовую группу в своих локальных политиках безопасности, чтобы признать доверенной исходящую информацию вашего проекта. Впрочем, есть еще одна небольшая деталь, которая может остаться незамеченной - установка Start external program в диалоговом окне Project Properties при работе с Visual Basic или Start Application в Visual C#. Оба эти параметра можно обнаружить в разделе Debugging папки Configuration Properties в соответствующих диалоговых окнах. Вы заметите, что эти значения жестко заданы и указывают на расположение соответствующего базового приложения Microsoft Office на компьютере, где была начата работа над проектом. Если этот путь не совпадает точно на вашем компьютере и компьютерах других разработчиков, то вам придется вручную изменять настройки при переносе проекта между ними.

Привязывание сборки к документу

Когда вы начинаете создавать проект "Visual Studio Tools for Office", мастер присваивает свойству Assembly Link Location значение относительного пути к исходному коду проекта. Эта информация включается в базовый документ в виде специальных свойств.

Совет. Если путь к сборке превышает 255 символов, то будут добавлены дополнительные параметры с суффиксом, представляющим собой увеличивающееся числовое значение (1, потом 2, потом 3 и так далее).

Кроме того, свойству Office Document присваивается значение полного пути к месту расположения документа. Если вы измените положение базового документа, вам потребуется изменить значение поля Command line arguments диалогового окна Project Properties в Visual Basic или поля Command Line Arguments в Visual C#. Оба эти параметра также можно найти в разделе Debugging папки Configuration Properties в соответствующих диалоговых окнах. При их изменении необходимо изменить соответствующим образом и настройки политики безопасности.

Заключение

При помощи "Visual Studio Tools for Office" вы сможете создавать для своих пользователей законченные документо-центричные решения, соединяющие мощь системы Microsoft Office и архитектуры .NET Framework 1.1. Используя Visual Basic или Visual C#, вы сможете разрабатывать приложения быстрее и получите более широкий выбор вариантов автоматического развертывания решений. Благодаря развитой модели безопасности, поддерживаемой общей языковой средой выполнения, вы сможете создавать более безопасные решения, которые будут выполнять только тот код, который вы определите как допустимый. В то же время пользователи будут чувствовать себя уверенно, применяя хорошо знакомые приложения, которые помогают им в повседневной работе.


Может пригодится:


Автор: Brian A. Randall
Прочитано: 10101
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру