How to Associazione per server di automazione Office con Visual C# .NET

Sommario

Quando si automatizza un'applicazione quale un'applicazione Microsoft Office, le chiamate alle proprietà e ai metodi degli oggetti dell'applicazione Office devono essere connesse in qualche modo a tali oggetti. Il processo di connessione delle chiamate a proprietà e metodi agli oggetti che implementano tali proprietà e metodi è definito comunemente
associazione. In Visual C# sono disponibili due tipi di associazione:
associazione anticipata
e
associazione tardiva. Il tipo di associazione scelto può influire su molti aspetti del programma, incluse prestazioni, flessibilità e semplicità di gestione.


In questo articolo vengono spiegate e messe a confronto le associazioni anticipata e tardiva per client di automazione Visual C# e vengono forniti esempi di codice per entrambi i tipi di associazione.

Informazioni

Associazione anticipata

Con l'associazione anticipata, Visual C# utilizza le informazioni sul tipo disponibili per l'applicazione Office in questione per creare un'associazione diretta ai metodi o alla proprietà necessarie. Il compilatore può eseguire controlli dei tipi e della sintassi per assicurare che al metodo o alla proprietà vengano passati il numero e il tipo corretti di parametri e che il valore restituito sia del tipo previsto. Poiché in fase di esecuzione sono richieste meno operazioni per effettuare una chiamata a una proprietà o a un metodo, l'associazione anticipata è talvolta più rapida. Sebbene l'associazione anticipata possa essere più veloce, le differenze a livello di prestazioni rispetto all'associazione tardiva sono tuttavia irrisorie.


L'associazione tardiva ha lo svantaggio, seppur minore, di provocare eventuali problemi di incompatibilità tra versioni. Si supponga ad esempio che un server di automazione quale Microsoft Excel 2002 introduca un nuovo metodo o una nuova proprietà non disponibile in Excel 2000 oppure modifichi una proprietà o un metodo esistenti. Tali modifiche potrebbero alterare il layout binario dell'oggetto e provocare problemi con un'applicazione Visual C# che utilizza le informazioni sul tipo di Excel 2002 per automatizzare Excel 2000. Per evitare questo inconveniente, quando si sviluppa e si verifica il client di automazione, è consigliabile utilizzare le informazioni sul tipo delle versioni precedenti dell'applicazione Office che si desidera supportare.


Di seguito è riportata la procedura per creare un client di automazione che utilizza l'associazione anticipata. Come dimostra la procedura, con l'associazione anticipata è necessario fare riferimento alla libreria dei tipi per il client di automazione.


Creare un client di automazione che utilizza l'associazione anticipata


  1. Avviare Microsoft Visual Studio .NET. Scegliere
    Nuovo
    dal menu
    File, quindi scegliere
    Progetto. Selezionare
    Applicazione Windows
    dai tipi di progetto Visual C#. In base all'impostazione predefinita viene creato il progetto Form1.
  2. Aggiungere un riferimento alla
    Libreria oggetti di Microsoft Excel. Per eseguire questa operazione, attenersi alla seguente procedura:
    1. Scegliere
      Aggiungi riferimento
      dal menu
      Progetto.
    2. Nella scheda
      COM
      individuare
      Microsoft Excel Object Library
      e scegliere
      Seleziona.


      NOTA: la Libreria oggetti di Microsoft Excel contiene un numero di versione. Il numero di versione per Excel 2000 è 9.0, mentre quello per Excel 2002 è 10.0.
    3. Scegliere
      OK
      nella finestra di dialogo
      Aggiungi riferimento
      per confermare le selezioni. Se viene richiesto di generare wrapper per le librerie selezionate, scegliere
      .
  3. Scegliere
    Casella degli strumenti
    dal menu
    Visualizza
    per visualizzare la Casella degli strumenti e aggiungere un pulsante a Form1.
  4. Fare doppio clic su
    Button1. Verrà visualizzata la finestra del codice del form.
  5. Nella finestra del codice sostituire il codice seguente
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    con:
    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);

    //Set the range value.
    //EXCEL9 Use:
    range.Value = "Hello, World!";
    //EXCEL10 Use:
    //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" );
    }
    }
    NOTA: come affermato in precedenza, questo codice utilizza la libreria di oggetti di Excel versione 9.0. Se durante l'aggiunta di riferimenti al progetto si è selezionata la Libreria oggetti di Microsoft Excel 10.0 anziché la versione 9.0, individuare nel codice i commenti che contengono "//Excel10" e rimuovere il commento dalla riga o righe di codice alle quali si riferisce il commento. Analogamente, individuare nel codice i commenti che contengono "//Excel9" e aggiungere il commento alla riga o righe di codice alle quali si riferisce il commento.


  6. con: Scorrere verso l'alto la pagina del codice. Aggiungere la riga seguente alla fine dell'elenco di direttive
    using:
    using System.Reflection; 

Associazione tardiva

A differenza dell'associazione anticipata, con l'associazione tardiva si attende fino alla fase di esecuzione per associare le chiamate a proprietà e metodi ai rispettivi oggetti. A tal scopo, l'oggetto di destinazione deve implementare una speciale interfaccia COM:
IDispatch. Il metodo
IDispatch::GetIDsOfNames
consente a Visual C# di interrogare un oggetto sui metodi e sulle proprietà che supporta e il metodo
IDispatch::Invoke
consente quindi a Visual C# di effettuare la chiamata a tali metodi e proprietà. L'associazione tardiva ha il vantaggio di rimuovere alcune delle dipendenze dalla versione che riguardano invece l'associazione anticipata. Presenta tuttavia lo svantaggio di rimuovere i controlli in fase di compilazione dell'integrità del codice di automazione, nonché di non fornire alcuna funzionalità Intellisense per la correzione di chiamate a metodi e proprietà.


Per utilizzare l'associazione tardiva in Visual C#, utilizzare il metodo
System.Type.InvokeMember. Tale metodo effettua la chiamata a
IDispatch::GetIDsOfNames
e
IDispatch::Invoke
per associare i metodi e le proprietà del server di automazione.


Creare un client di automazione che utilizza l'associazione tardiva


  1. Avviare Microsoft Visual Studio .NET. Scegliere
    Nuovo
    dal menu
    File, quindi scegliere
    Progetto. Selezionare
    Applicazione Windows
    dai tipi di progetto Visual C#. In base all'impostazione predefinita viene creato il progetto Form1.
  2. Aggiungere un riferimento alla
    Libreria oggetti di Microsoft Excel. Per eseguire questa operazione, attenersi alla seguente procedura:
    1. Scegliere
      Aggiungi riferimento
      dal menu
      Progetto.
    2. Nella scheda
      COM
      individuare
      Microsoft Excel Object Library
      e scegliere
      Seleziona.


      NOTA: la Libreria oggetti di Microsoft Excel contiene un numero di versione. Il numero di versione per Excel 2000 è 9.0, mentre quello per Excel 2002 è 10.0.
    3. Scegliere
      OK
      nella finestra di dialogo
      Aggiungi riferimento
      per confermare le selezioni. Se viene richiesto di generare wrapper per le librerie selezionate, scegliere
      .
  3. Scegliere
    Casella degli strumenti
    dal menu
    Visualizza
    per visualizzare la Casella degli strumenti e aggiungere un pulsante a Form1.
  4. Fare doppio clic su
    Button1. Verrà visualizzata la finestra del codice del form.
  5. Nella finestra del codice sostituire il codice seguente
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    con:
    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" );
    }
    }
  6. con: Scorrere verso l'alto la pagina del codice. Aggiungere la riga seguente alla fine dell'elenco di direttive
    using:
    using System.Reflection; 

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web Microsoft Developer Network (MSDN)(informazioni in lingua inglese):
Microsoft Office Development with Visual Studio

http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx

Per ulteriori informazioni sull'associazione, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportati di seguito (gli articoli con prefisso "Q" contengono informazioni in inglese):

245115 INFO: Using Early Binding and Late Binding in Automation
244167 INFO: Writing Automation Clients for Multiple Office Versions
247579 INFO: Use DISPID Binding to Automate Office Applications Whenever Possible
Proprietà

ID articolo: 302902 - Ultima revisione: 29 giu 2007 - Revisione: 1

Feedback