Связывание с помощью Visual C# .NET для автоматизации приложений Microsoft Office (исходники)

Источник: CodingClub

Аннотация

При автоматизации таких приложений, как приложения Microsoft Office, вызовы свойств и методов объектов приложений Microsoft Office должны быть определенным образом сопоставлены этим объектам. Процесс сопоставления вызовов свойств и методов объектам, реализующим эти свойства и методы, называется связыванием . В Visual C# существуют два типа связывания: раннее связывание и позднее связывание . Выбор типа связывания влияет на такие характеристики приложения, как производительность, гибкость и удобство сопровождения.

В данной статье рассматриваются и сравниваются раннее и позднее связывание в клиентах автоматизации, написанных на Visual C#, и приводятся примеры обоих типов связывания.

Раннее связывание

С помощью раннего связывания Visual C# осуществляет привязку непосредственно к соответствующим методам и свойствам, используя сведения о типах для данного приложения Microsoft Office. При этом компилятор может проверить синтаксис и соответствие типов, правильность указания числа и типа параметров, передаваемых методу или свойству, и тип возвращаемого значения. Поскольку при выполнении приложения раннее связывание требует меньше времени для вызова свойств или методов, оно может работать быстрее, чем позднее. Однако разница в производительности, как правило, незначительна.

Раннее связывание имеет недостаток, который может вызвать проблемы совместимости версий. Предположим, что в сервере автоматизации (например, в Microsoft Excel 2002) реализованы новый метод или свойство, недоступные в Microsoft Excel 2000, или внесены изменения в существующие метод или свойство. Это может изменить размещение объекта и привести к появлению ошибок в приложениях Visual C#, использующих для автоматизации приложения Microsoft Excel 2002 предоставляемые им сведения о типах. Для предотвращения подобных проблем рекомендуется при разработке и проверке клиента автоматизации использовать сведения о типах для самой ранней версии поддерживаемого приложения Microsoft Office.

В следующем примере рассмотрено построение клиента автоматизации с использованием раннего связывания. Обратите внимание, что использование раннего связывания требует указания библиотеки типов для клиента автоматизации.


Создание клиента автоматизации, использующего раннее связывание

1. Запустите Microsoft Visual Studio.NET. В меню Файл выберите команду Создать, а затем выберите пункт Проект. Выберите из числа проектов Visual C# тип Приложение Windows. По умолчанию создается форма Form1.
2. Добавьте ссылку на библиотеку Microsoft Excel Object Library. Для этого выполните следующие действия. a.  В меню Проект выберите команду Добавить ссылку.
b.  На вкладке COM выберите Microsoft Excel Object Library и нажмите кнопку Выбрать.

Примечание. Microsoft Office 2003 включает основные сборки взаимодействия (PIA). Microsoft Office XP не включает эти сборки, но их можно загрузить. Дополнительные сведения об основных сборках взаимодействия (PIA) для Microsoft Office XP содержатся в следующей статье Microsoft Knowledge Base:
328912 (http://support.microsoft.com/kb/328912/RU/) INFO: Microsoft Office XP PIAs Are Available for Download
c.  Чтобы сохранить выбранное значение в окне Добавление ссылки, нажмите кнопку OK. При появлении предложения создать сборку-обертку для библиотек нажмите кнопку Да.
 
3. В меню Вид выберите пункт Область элементов, чтобы отобразить панель инструментов и добавить кнопку в форму Form1.
4. Дважды щелкните кнопку Button1. Появится окно кода для формы.
5. В этом окне замените следующий код private void button1_Click(object sender, System.EventArgs e)
{
}
     
на: private void button1_Click(object sender, System.EventArgs e)
{
 Excel.Application objApp;
 Excel._Workbook objBook;
 Excel.Workbooks objBooks;
 Excel.Sheets objSheets;
 Excel._Worksheet objSheet;
 Excel.Range range;

 try
 {
  // Instantiate Excel and start a new workbook.
  objApp = new Excel.Application();
  objBooks = objApp.Workbooks;
  objBook = objBooks.Add( Missing.Value );
  objSheets = objBook.Worksheets;
  objSheet = (Excel._Worksheet)objSheets.get_Item(1);

  range = objSheet.get_Range("A1", Missing.Value);

  range.set_Value(Missing.Value, "Hello, World!" );

  //Return control of Excel to the user.
  objApp.Visible = true;
  objApp.UserControl = true;
 }
 catch( Exception theException )
 {
  String errorMessage;
  errorMessage = "Error: ";
  errorMessage = String.Concat( errorMessage, theException.Message );
  errorMessage = String.Concat( errorMessage, " Line: " );
  errorMessage = String.Concat( errorMessage, theException.Source );

  MessageBox.Show( errorMessage, "Error" );
 }

     
 
6. Перейдите в начало окна кода. В конец списка директив using добавьте следующие строки:using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;

Позднее связывание

В отличие от раннего связывания, позднее связывание сопоставляет вызовы свойств и методов соответствующим объектам в процессе выполнения программы. Для этого в требуемых объектах должен быть реализован специальный интерфейс COM: IDispatch. Метод IDispatch::GetIDsOfNames позволяет запрашивать объект о поддерживаемых методах и свойствах, а метод IDispatch::Invoke позволяет вызывать эти свойства и методы. Это дает возможность при использовании позднего связывания избежать некоторых зависимостей от версии, присущих раннему связыванию. Недостатком позднего связывания является то, что оно не позволяет проверять целостность кода автоматизации на этапе компиляции и не поддерживает возможности Intellisense, обеспечивающие правильность вызовов методов и свойств.

Для использования позднего связывания Visual C# необходимо применить метод System.Type.InvokeMember. Этот метод вызывает методы IDispatch::GetIDsOfNames и IDispatch::Invoke для привязки к методам и свойствам сервера автоматизации.


Создание клиента автоматизации, использующего позднее связывание

1. Запустите Microsoft Visual Studio.NET. В меню Файл выберите команду Создать, а затем - пункт Проект. Выберите из числа проектов Visual C# тип Приложение Windows. По умолчанию создается форма Form1.
2. В меню Вид выберите пункт Область элементов, чтобы отобразить панель инструментов и добавить кнопку в форму Form1.
3. Дважды щелкните кнопку Button1. Появится окно кода для формы.
4. В этом окне замените код private void button1_Click(object sender, System.EventArgs e)
{
}
      
на:private void button1_Click(object sender, System.EventArgs e)
{
 object objApp_Late;
 object objBook_Late;
 object objBooks_Late;
 object objSheets_Late;
 object objSheet_Late;
 object objRange_Late;
 object[] Parameters;

 try
 {
  // Instantiate Excel.
  objApp_Late = (object)new Excel.Application();

  //Get the workbooks collection.
  objBooks_Late = objApp_Late.GetType().InvokeMember( "Workbooks",
  BindingFlags.GetProperty, null, objApp_Late, null );

  //Add a new workbook.
  objBook_Late = objBooks_Late.GetType().InvokeMember( "Add",
   BindingFlags.InvokeMethod, null, objBooks_Late, null );

  //Get the worksheets collection.
  objSheets_Late = objBook_Late.GetType().InvokeMember( "Worksheets",
   BindingFlags.GetProperty, null, objBook_Late, null );

  //Get the first worksheet.
  Parameters = new Object[1];
  Parameters[0] = 1;
  objSheet_Late = objSheets_Late.GetType().InvokeMember( "Item",
   BindingFlags.GetProperty, null, objSheets_Late, Parameters );

  //Get a range object that contains cell A1.
  Parameters = new Object[2];
  Parameters[0] = "A1";
  Parameters[1] = Missing.Value;
  objRange_Late = objSheet_Late.GetType().InvokeMember( "Range",
   BindingFlags.GetProperty, null, objSheet_Late, Parameters );

  //Write "Hello, World!" in cell A1.
  Parameters = new Object[1];
  Parameters[0] = "Hello, World!";
  objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty,
   null, objRange_Late, Parameters );

  //Return control of Excel to the user.
  Parameters = new Object[1];
  Parameters[0] = true;
  objApp_Late.GetType().InvokeMember( "Visible", BindingFlags.SetProperty,
   null, objApp_Late, Parameters );
  objApp_Late.GetType().InvokeMember( "UserControl", BindingFlags.SetProperty,
   null, objApp_Late, Parameters );
 }
 catch( Exception theException )
 {
  String errorMessage;
  errorMessage = "Error: ";
  errorMessage = String.Concat( errorMessage, theException.Message );
  errorMessage = String.Concat( errorMessage, " Line: " );
  errorMessage = String.Concat( errorMessage, theException.Source );

  MessageBox.Show( errorMessage, "Error" );
 }
}
     
 
5. Перейдите в начало окна кода. В конец списка директив using добавьте следующую строку:using System.Reflection;


Страница сайта http://185.71.96.61
Оригинал находится по адресу http://185.71.96.61/home.asp?artId=7544