Связывание с серверами автоматизации Office
При автоматизации приложений Microsoft Office, вызовы свойств и методов объектов приложений Microsoft Office должны быть определенным образом подключены к этим объектам. Процесс подключения вызовов свойств и методов к объектам, реализующим эти свойства и методы, обычно называется связыванием. В Visual C# существуют два типа связывания: раннее связывание и позднее связывание. Выбор типа связывания влияет на такие характеристики приложения, как производительность, гибкость и удобство сопровождения.
В данной статье мы рассмотрим раннее и позднее связывание в клиентах автоматизации, написанных на Visual C#.
Раннее связывание
С помощью раннего связывания Visual C# осуществляет привязку непосредственно к соответствующим методам и свойствам, используя сведения о типах для данного приложения Microsoft Office. При этом компилятор может проверить синтаксис и соответствие типов, правильность указания числа и типа параметров, передаваемых методу или свойству, и тип возвращаемого значения. Поскольку при выполнении приложения раннее связывание требует меньше времени для вызова свойств или методов, оно может работать быстрее, чем позднее. Однако разница в производительности, как правило, незначительна.
Раннее связывание имеет небольшой недостаток, заключающийся в том, что оно может вызвать проблемы совместимости версий. Предположим, что в сервере автоматизации (например, в Microsoft Excel 2002) реализованы новый метод или свойство, недоступные в Microsoft Excel 2000, или внесены изменения в существующие метод или свойство. Эти изменения могут повлиять на двоичное размещение объекта и привести к появлению ошибок с приложением Visual C#, использующем сведения о типах Excel 2002 для автоматизации Excel 2000. Для предотвращения подобных проблем с ранним связыванием есть общая рекомендация: при разработке и проверке клиента автоматизации использовать сведения о типах для самой ранней версии поддерживаемого приложения Microsoft Office.
Раннее связывание
Создадим пример построения клиента автоматизации с использованием раннего связывания.
Создайте новый проект Automation. Добавьте ссылку на библиотеку Microsoft Excel Object Library. Для этого в меню Project выберите команду Add Reference. На вкладке COM выберите Microsoft Excel 12.0 Object Library и нажмите кнопку OK (номер библиотеки зависит от версии MS Office, для MS Office 2007 он равен 12.0).
Перейдите в начало окна кода. В списке директив using добавьте еще одну строку:
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
Далее добавим код для кнопки
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
{
// Создание экземпляра Excel и запуск новой рабочей книги.
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, "Здравствуй, мир!" );
//Возвращение контроля над Excel пользователю.
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" );
}
}
В результате выполнения этого кода у вас запустится Excel с новой книгой и на первом листе будет выведена фраза Здравствуй, мир.
Позднее связывание
В отличие от раннего связывания, позднее связывание сопоставляет вызовы свойств и методов соответствующим объектам в процессе выполнения программы. Для этого в требуемых объектах должен быть реализован специальный интерфейс COM: IDispatch. Метод GetIDsOfNames позволяет запрашивать объект о поддерживаемых методах и свойствах, а метод Invoke позволяет вызывать эти свойства и методы. Это дает возможность при использовании позднего связывания избежать некоторых зависимостей от версии, присущих раннему связыванию. Недостатком позднего связывания является то, что оно не позволяет проверять целостность кода автоматизации на этапе компиляции и не поддерживает возможности Intellisense, которые могут предоставить сведения для правильного вызова методов и свойств.
Для использования позднего связывания Visual C# необходимо применить метод System.Type.InvokeMember. Этот метод вызывает методы GetIDsOfNames и Invoke для привязки к методам и свойствам сервера автоматизации.
Создадим пример создания клиента автоматизации, использующего позднее связывание.
Снова запустите Visual Studio и создайте новый проект. Добавьте кнопку на форму Form1 и напишем для нее код:
using System.Reflection;
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
{
// Получение типа класса и создание экземпляра Excel.
Type objClassType;
objClassType = Type.GetTypeFromProgID("Excel.Application");
objApp_Late = Activator.CreateInstance(objClassType);
//Получение коллекции рабочих книг.
objBooks_Late = objApp_Late.GetType().InvokeMember( "Workbooks",
BindingFlags.GetProperty, null, objApp_Late, null );
//Добавление новой рабочей книги.
objBook_Late = objBooks_Late.GetType().InvokeMember( "Add",
BindingFlags.InvokeMethod, null, objBooks_Late, null );
//Получение коллекции рабочих листов.
objSheets_Late = objBook_Late.GetType().InvokeMember( "Worksheets",
BindingFlags.GetProperty, null, objBook_Late, null );
//Получение первого рабочего листа.
Parameters = new Object[1];
Parameters[0] = 1;
objSheet_Late = objSheets_Late.GetType().InvokeMember( "Item",
BindingFlags.GetProperty, null, objSheets_Late, Parameters );
//Получение объекта диапазона, содержащего ячейку 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 );
//Написать "Hello, World!" в ячейке A1.
Parameters = new Object[1];
Parameters[0] = "Hello, World!";
objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty,
null, objRange_Late, Parameters );
//Возвращение контроля над Excel пользователю.
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" );
}
}
Дополнительные материалы
Реклама
Паркет - Ваш выбор цена/качество - паркет дуб . Отраслевая выставка MosBuild.
Компьютерный сервисный центр: ремонт компьютеров . Ремонт, настройка ПК в Сургуте.