Связывание с серверами автоматизации Office при помощи Visual C# .NET

Переводы статьи Переводы статьи
Код статьи: 302902 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

При автоматизации таких приложений, как приложения 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.

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

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

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

      Примечание. В состав Office 2003 входят основные сборки взаимодействия (PIA). Microsoft Office XP не включает эти сборки, но их можно загрузить. Для получения дополнительных сведений об основных сборках взаимодействия PIA для Office XP щелкните номер следующей статьи базы знаний Майкрософт:
      328912 Загрузка основных сборок взаимодействия (PIA) для Microsoft Office XP
    3. Для подтверждения сделанного выбора нажмите кнопку OK в диалоговом окне Add References. Если появится запрос на создание оберток для выбранных библиотек, нажмите кнопку Yes.
  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
    	{
    		// Создание экземпляра 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, "Hello, World!" );
    
    		//Возвращение контроля над 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" );
    	}
    }  
    					
  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
    	{
    		// Получение типа класса и создание экземпляра 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" );
    	}
    }
    					
  5. Перейдите в начало окна кода. В конец списка директив using добавьте следующую строку:
    using System.Reflection;
    					

Ссылки

Для получения дополнительных сведений посетите следующий веб-узел MSDN:
Использование Visual Studio для программирования Microsoft Office
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Для получения дополнительных сведений о связывании щелкните номера следующих статей базы знаний Майкрософт:
245115 Использование раннего и позднего связывания в автоматизации (Эта ссылка может указывать на содержимое полностью или частично на английском языке)
244167 Написание клиентов автоматизации для нескольких версий Office (Эта ссылка может указывать на содержимое полностью или частично на английском языке)
247579 Использование связывания DISPID для автоматизации приложений Office при любых условиях (Эта ссылка может указывать на содержимое полностью или частично на английском языке)

Свойства

Код статьи: 302902 - Последний отзыв: 17 апреля 2007 г. - Revision: 7.3
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
Ключевые слова: 
kbpia kbautomation kbhowtomaster KB302902

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com