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

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: 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

Identyfikator artykułu: 302902 — ostatni przegląd: 11.11.2008 — zmiana: 1

Opinia