Realizacja wiązania dla serwerów automatyzacji pakietu Office za pomocą programu Visual C# .NET

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 302902 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Streszczenie

Podczas dokonywania automatyzacji jakiejś aplikacji, na przykład aplikacji pakietu Microsoft Office, wywołania właściwości i metod obiektów aplikacji pakietu Office muszą być w jakiś sposób połączone z tymi obiektami. Proces łączenia wywołań właściwości i metod z obiektami stosującymi te właściwości i metody nosi ogólną nazwę wiązania. W programie Visual C# dostępne są dwa typy wiązania: wczesne wiązanie i późne wiązanie. Wybór typu wiązania może mieć wpływ na wiele aspektów danego programu, włącznie z wydajnością, elastycznością i możliwościami w zakresie obsługi.

W tym artykule opisano i porównano wczesne i późne wiązanie dla klientów automatyzacji programu Visual C# i podano przykłady kodu ilustrujące oba typy wiązania.

Wczesne wiązanie

Przy wczesnym wiązaniu program Visual C# korzysta z informacji o typie dostępnych odnośnie do rozpatrywanej aplikacji pakietu Office, w celu związania bezpośrednio z metodami i właściwościami, z których musi ona korzystać. Kompilator może sprawdzać typ i składnię w celu zapewnienia, aby metodzie lub właściwości przekazana została właściwa liczba i typ parametrów oraz aby zwracana wartość była odpowiedniego typu. Wywołanie właściwości lub metody wymaga w czasie działania mniejszej liczby operacji, dlatego wczesne wiązanie bywa czasem szybsze w działaniu. Choć jednak wczesne wiązanie może działać szybciej, różnice w wydajności w porównaniu z późnym wiązaniem są często znikome.

Wczesne wiązanie ma też niewielką wadę, może mianowicie powodować problemy związane ze zgodnością wersji. Załóżmy na przykład, że w serwerze automatyzacji, takim jak Microsoft Excel 2002, wprowadzono nową metodę lub właściwość niedostępną w programie Excel 2000 albo dokonano zmiany istniejącej właściwości lub metody. Zmiany te mogą spowodować zmianę binarnego układu obiektu i problemy dotyczące aplikacji Visual C#, która korzysta z informacji o typie zgodnej z programem Excel 2002 w celu automatyzacji programu Excel 2000. Aby uniknąć tego problemu z wczesnym wiązaniem, przy programowaniu i testowaniu klienta automatyzacji zaleca się generalnie korzystanie z informacji o typie zgodnej z najwcześniejszą wersją aplikacji pakietu Office, która ma być obsługiwana.

Za pomocą następujących czynności zademonstrowano sposób budowania klienta automatyzacji korzystającego z wczesnego wiązania. Należy zwrócić uwagę, że — jak widać w tych czynnościach — wczesne wiązanie wymaga odwołania się do biblioteki typów w odniesieniu do klienta automatyzacji.

Tworzenie klienta automatyzacji korzystającego z wczesnego wiązania

  1. Uruchom program Microsoft Visual Studio .NET. W menu File kliknij polecenie New, a następnie kliknij przycisk Project. Spośród typów projektów programu Visual C# wybierz pozycję Windows Application. Domyślnie utworzony zostanie formularz Form1.
  2. Dodaj odwołanie do biblioteki Microsoft Excel Object Library. Aby to zrobić, wykonaj następujące kroki:
    1. W menu Project kliknij polecenie Add Reference.
    2. Na karcie COM odszukaj pozycję Microsoft Excel Object Library i kliknij przycisk Wybierz.

      Uwaga: Pakiet Office 2003 zawiera składniki PIA (Primary Interop Assembly). Pakiet Office XP nie zawiera tych składników, ale można je pobrać z sieci Web. Aby uzyskać dodatkowe informacje dotyczące składników PIA pakietu Office XP, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
      328912 INFO: Pliki PIA pakietu Microsoft Office XP są dostępne do pobrania
    3. Kliknij przycisk OK w oknie dialogowym Add References, aby zaakceptować zaznaczenie. Jeśli wyświetlony zostanie monit dotyczący wygenerowania wrapperów dla zaznaczonych bibliotek, kliknij przycisk Yes.
  3. W menu View wybierz polecenieToolbox, aby wyświetlić przybornik, i dodaj przycisk do formularza Form1.
  4. Kliknij dwukrotnie przycisk Button1. Wyświetlone zostanie okno kodu programu dla formularza.
  5. W oknie kodu programu zastąp następujący kod
    ?private void button1_Click(object sender, System.EventArgs e)
    
    {
    }
    					
    na taki:
    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
    	{
    		//Utworzenie wystąpienia programu Excel i uruchomienie nowego skoroszytu.
    		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!" );
    
    		//Przywrócenie użytkownikowi kontroli nad programem 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. Przewiń okno kodu programu do góry. Na końcu listy dyrektyw typu using dodaj następujący wiersz:
    ?using System.Reflection; 
    
    using Excel = Microsoft.Office.Interop.Excel;
    					

Późne wiązanie

W przeciwieństwie do wczesnego wiązania w procedurze późnego wiązania wiązanie wywołań właściwości i metod z ich obiektami następuje dopiero w czasie uruchomienia. W tym celu obiekt docelowy musi mieć zaimplementowany specjalny interfejs modelu COM: IDispatch. Metoda IDispatch::GetIDsOfNames umożliwia programowi Visual C# zadawanie obiektowi pytań na temat obsługiwanych metod i właściwości, a następnie metoda IDispatch::Invoke umożliwia programowi Visual C# wywoływanie tych metod i właściwości. Zatem zaletą późnego wiązania jest usunięcie niektórych zależności od wersji, co jest cechą wczesnego wiązania. Wadą tej metody jest jednak pominięcie sprawdzania integralności kodu automatyzacji w czasie kompilacji oraz brak funkcji Intellisense, które zapewniają klucze do prawidłowych wywołań metod i właściwości.

Aby skorzystać z późnego wiązania w programie Visual C#, należy użyć metody System.Type.InvokeMember. Metoda ta wywołuje metody IDispatch::GetIDsOfNames oraz IDispatch::Invoke w celu wiązania z metodami i właściwościami serwera automatyzacji.

Tworzenie klienta automatyzacji korzystającego z późnego wiązania

  1. Uruchom program Microsoft Visual Studio .NET. W menu File kliknij polecenie New, a następnie kliknij przycisk Project. Spośród typów projektów programu Visual C# wybierz pozycję Windows Application. Domyślnie utworzony zostanie formularz Form1.
  2. W menu View wybierz polecenieToolbox, aby wyświetlić przybornik, i dodaj przycisk do formularza Form1.
  3. Kliknij dwukrotnie przycisk Button1. Wyświetlone zostanie okno kodu programu dla formularza.
  4. W oknie kodu programu zastąp następujący kod
    ?private void button1_Click(object sender, System.EventArgs e)
    
    {
    }
    						
    na taki:
    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
    	{
    		//Uzyskanie typu klasy i utworzenie wystąpienia programu Excel.
    		Type objClassType; 
    		objClassType = Type.GetTypeFromProgID("Excel.Application"); 
    		objApp_Late = Activator.CreateInstance(objClassType);
    
    		//Pobranie kolekcji skoroszytów.
    		objBooks_Late = objApp_Late.GetType().InvokeMember( "Workbooks", 
    		BindingFlags.GetProperty, null, objApp_Late, null );
    
    		//Dodanie nowego skoroszytu.
    		objBook_Late = objBooks_Late.GetType().InvokeMember( "Add", 
    			BindingFlags.InvokeMethod, null, objBooks_Late, null );
    
    		//Pobranie kolekcji arkuszy.
    		objSheets_Late = objBook_Late.GetType().InvokeMember( "Worksheets",
    			BindingFlags.GetProperty, null, objBook_Late, null );
    
    		//Pobranie pierwszego arkusza.
    		Parameters = new Object[1];
    		Parameters[0] = 1;
    		objSheet_Late = objSheets_Late.GetType().InvokeMember( "Item", 
    			BindingFlags.GetProperty, null, objSheets_Late, Parameters );
    
    		//Pobranie obiektu zakresu zawierającego komórkę 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 );
    
    		//Wpisanie w komórce  A1 „Hello, World!".
    		Parameters = new Object[1];
    		Parameters[0] = "Hello, World!";
    		objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, 
    			null, objRange_Late, Parameters );
    
    		//Przywrócenie użytkownikowi kontroli nad programem 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. Przewiń okno kodu programu do góry. Na końcu listy dyrektyw typu using dodaj następujący wiersz:
    ?using System.Reflection; 
     
    					

Materiały referencyjne

Aby uzyskać więcej informacji, odwiedź następującą witrynę usługi MSDN (Microsoft Developer Network) w sieci Web:
Microsoft Office Development with Visual Studio
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/vsofficedev.asp
Aby uzyskać dodatkowe informacje dotyczące wiązania, kliknij następujące numery artykułów w celu wyświetlenia tych artykułów z bazy wiedzy Microsoft Knowledge Base:
245115 Using early binding and late binding in Automation
244167 Writing Automation clients for multiple Office versions
247579 Use DISPID binding to automate Office applications whenever possible

Właściwości

Numer ID artykułu: 302902 - Ostatnia weryfikacja: 2 maja 2006 - Weryfikacja: 6.2
Informacje zawarte w tym artykule dotyczą:
  • 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
Słowa kluczowe: 
kbpia kbautomation kbhowtomaster KB302902

Przekaż opinię

 

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