Come usare Visual C# per automatizzare un'istanza in esecuzione di un'applicazione di Office

Riepilogo

Questo articolo dettagliato illustra come creare un client Microsoft Visual C# 2005 o Microsoft Visual C# .NET che ottiene un riferimento di automazione a un'istanza in esecuzione di un programma di Office.

Creare un'applicazione Visual C# 2005 o Visual C# .NET che automatizza un'istanza in esecuzione di un programma di Office

I programmi client che automatizzano Office possono creare una nuova istanza del programma di Office o ottenere un riferimento all'istanza già in esecuzione. Microsoft consiglia in genere di creare una nuova istanza anziché collegarsi a un'istanza in esecuzione. In alcuni scenari, tuttavia, il programma client deve automatizzare un'istanza già in esecuzione di un programma di Office. In questo caso, il client di automazione ottiene il riferimento all'oggetto COM (Component Object Model) del server di Automazione dalla tabella ROT (Running Object Table).

Se il server di automazione si è registrato nella tabella degli oggetti in esecuzione, un client .NET può ottenere un riferimento all'istanza in esecuzione chiamando quanto segue:

System.Runtime.InteropServices.Marshal.GetActiveObject

-oppure-

System.Runtime.InteropServices.Marshal.BindToMoniker

Codice di esempio

  1. Avviare Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET. Scegliere Nuovo dal menu File e quindi fare clic su Progetto. In Tipi di progetto fare clic su Progetti Visual C# e quindi in Modelli fare clic su Applicazione Windows. Form1 viene creato per impostazione predefinita.

    Nota In Visual C# 2005 fare clic su Visual C# anziché Su progetti Visual C#.

  2. Aggiungere un riferimento alla libreria di oggetti di Microsoft Excel e alla libreria di oggetti di Microsoft Word. A tal fine, attenersi alla seguente procedura:

    1. Scegliere Aggiungi riferimento dal menu Progetto.

    2. Nella scheda COM individuare lalibreria di oggetti di Microsoft Excel e quindi fare clic su Seleziona.

      Nota In Visual C# 2005 non è necessario fare clic su Seleziona.

      Nota Microsoft Office 2003 include assembly di interoperabilità primari ( PIA). Microsoft Office XP non include le FUNZIONALITÀ personali, ma può essere scaricato.

    3. Individuare la libreria di oggetti di Microsoft Word e quindi fare clic su Seleziona.

      Nota In Visual C# 2005 non è necessario fare clic su Seleziona.

    4. Nella finestra di dialogo Aggiungi riferimenti fare clic su OK per accettare le selezioni.

  3. Scegliere Casella degli strumenti dal menu Visualizza per visualizzare la casella degli strumenti. Aggiungere tre pulsanti e una casella di testo a Form1. Digitare il testo per questi controlli come indicato di seguito:

    ID Testo
    button1 Ottenere informazioni di riferimento su automazione per l'esecuzione dell'istanza di Excel
    button2 Ottenere informazioni di riferimento sull'automazione in Excel usando il moniker di file
    button3 Shell Word e get Automation Reference to it (Informazioni di riferimento su Shell Word e Get Automation Reference)
    textBox1 Immettere il nome file per il file xls salvato
  4. Configurare i gestori eventi Click dei controlli pulsante, come indicato di seguito:

    1. Fare doppio clic su button1 e quindi fare clic su Progettazione dal menu Visualizza.
    2. Fare doppio clic sul pulsante 2 e quindi scegliere Progettazione dal menu Visualizza.
    3. Fare doppio clic sul pulsante3.
  5. Aggiungere il codice seguente all'inizio di Form1.cs, dopo le altre istruzioni using:

    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
  6. Aggiungere il codice seguente ai gestori eventi:

    private void button1_Click(object sender, System.EventArgs e)
    {
    
    //Excel Application Object
    Excel.Application oExcelApp;
    
    this.Activate();
    
    //Get reference to Excel.Application from the ROT.
    oExcelApp =  (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    
    //Display the name of the object.
    MessageBox.Show(oExcelApp.ActiveWorkbook.Name);
    
    //Release the reference.
    oExcelApp = null;
    }
    
    private void button2_Click(object sender, System.EventArgs e)
    {
    Excel.Workbook  xlwkbook;
    Excel.Worksheet xlsheet;
    
    //Get a reference to the Workbook object by using a file moniker.
    //The xls was saved earlier with this file name.
    xlwkbook = (Excel.Workbook)  System.Runtime.InteropServices.Marshal.BindToMoniker(textBox1.Text); 
    
    string sFile = textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\")+1);
    xlwkbook.Application.Windows[sFile].Visible = true;
    xlwkbook.Application.Visible = true;
    xlsheet = (Excel.Worksheet) xlwkbook.ActiveSheet;
    xlsheet.Visible = Excel.XlSheetVisibility.xlSheetVisible;
    xlsheet.Cells[1,1] = 100;
    
    //Release the reference.
    xlwkbook = null;
    xlsheet = null;
    }
    
    private void button3_Click(object sender, System.EventArgs e)
    {
    Word.Application wdapp;
    
    //Shell Word
    System.Diagnostics.Process.Start("<Path to WINWORD.EXE>");
    
    this.Activate();
    
    //Word and other Office applications register themselves in 
    //ROT when their top-level window loses focus. Having a MessageBox 
    //forces Word to lose focus and then register itself in the ROT.
    
    MessageBox.Show("Launched Word");
    
    //Get the reference to Word.Application from the ROT.
    wdapp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
    
    //Display the name.
    MessageBox.Show(wdapp.Name);
    
    //Release the reference.
    wdapp = null;
    }
    
    

    Nota In button3_click() sostituire Path to Winword.exe con il percorso corretto per Winword.exe. Il percorso predefinito per Microsoft Word è C:\Programmi\Microsoft Office\Office\Winword.exe.

  7. Nel menu Compila selezionare Compila soluzione per compilare l'applicazione.

Testare l'applicazione

  1. Premere F5 per compilare ed eseguire l'applicazione.
  2. Arrestare tutte le istanze in esecuzione di Excel.
  3. Avviare Excel con una nuova cartella di lavoro.
  4. Fare clic sul pulsante Recupera riferimento all'automazione per l'esecuzione di Istanza di Excel .
  5. L'applicazione ottiene il riferimento di automazione all'istanza esistente di Excel. Il riferimento di automazione viene archiviato nella variabile locale oExcelApp per button1_Click. In una finestra di messaggio viene visualizzato il nome della cartella di lavoro attiva.
  6. Salvare la cartella di lavoro nel disco locale. Lasciare aperta la cartella di lavoro in Excel.
  7. Digitare il percorso completo e il nome file della cartella di lavoro salvata nel passaggio precedente in textBox1.
  8. Fare clic sul pulsante Get Automation Reference to Excel using File Moniker (Recupera riferimento all'automazione in Excel tramite moniker file ).
  9. L'applicazione ottiene un riferimento di automazione all'istanza in esecuzione di Excel. Il riferimento all'automazione viene archiviato nella variabile locale xlwkbookper button2_Click. Il valore 100 viene immesso nella prima riga e nella prima colonna del foglio attivo.
  10. Uscire da Excel senza salvare le modifiche apportate alla cartella di lavoro.
  11. Fare clic sul pulsante Get Automation Reference to Excel using File Moniker (Recupera riferimento all'automazione in Excel tramite moniker file ).
  12. Viene creata una nuova istanza di Excel e viene aperta la cartella di lavoro salvata in precedenza. L'applicazione ottiene un riferimento di automazione a questa istanza di Excel. Il riferimento all'automazione viene archiviato nella variabile locale xlwkbook per button2_Click. Il valore 100 viene immesso nella prima riga e nella prima colonna del foglio attivo.
  13. Chiudere Excel.
  14. Fare clic sul pulsante Shell Word e ottenere informazioni di riferimento sull'automazione .
  15. Word viene avviato, proprio come se fosse stato avviato da un prompt dei comandi e viene visualizzata una finestra di messaggio Di parola avviata. La visualizzazione di una finestra di messaggio impone l'invio di un messaggio di WM_SETFOCUS alla finestra del programma Word. In questo modo Word può registrarsi nella tabella degli oggetti in esecuzione (ROT).
  16. Chiudere la finestra di messaggio. Il programma ottiene un riferimento di automazione all'istanza appena avviata di Word. Il riferimento all'automazione viene archiviato nella variabile locale wdapp per button3_Click. Viene visualizzata una finestra di messaggio che mostra il nome dell'oggetto Word.Application.

Note aggiuntive

I server COM possono essere classificati come multiuso (istanza singola) o a uso singolo (più istanze), a seconda del numero di istanze di tale server che possono essere eseguite contemporaneamente in un singolo computer.

Quando una richiesta per un nuovo oggetto COM viene inviata a un server COM multiuso (istanza singola), il server utilizza una sola istanza del file .exe per creare tale oggetto. Indipendentemente dal numero di client che richiedono un nuovo oggetto COM, sarà presente un solo server .exe processo. Nel server a utilizzo singolo (più istanze) ogni richiesta per un nuovo oggetto COM avvia un'istanza separata del file .exe server. Pertanto, più di un'istanza del server può essere eseguita nello stesso computer.

È possibile eseguire contemporaneamente più istanze di Word (Winword.exe), Excel (Excel.exe) e Microsoft Access (MSAccess.exe). Di conseguenza, questi server sono definiti come server a utilizzo singolo (più istanze). Solo un'istanza di PowerPoint (Powerpnt.exe) può essere eseguita in un determinato momento. PowerPoint è pertanto un server multiuso (istanza singola).

Se un server COM è a uso singolo (più istanze) o multiuso (istanza singola) potrebbe influire sulla decisione di usare GetActiveObject per ottenere il riferimento a tale server. Poiché è possibile che siano in esecuzione più istanze di Word, Excel o Microsoft Access, GetActiveObject in un determinato server potrebbe restituire un'istanza non prevista. L'istanza registrata per la prima volta in ROT è in genere l'istanza restituita da GetActiveObject. Se si vuole ottenere un riferimento di automazione a un'istanza in esecuzione specifica di Word, Excel o Microsoft Access, usare BindToMoniker con il nome del file aperto in tale istanza. Per un server multiuso (istanza singola) come PowerPoint, non è importante, perché il riferimento di automazione punta alla stessa istanza in esecuzione.

È previsto che i server COM si registrino nella tabella degli oggetti in esecuzione dopo l'avvio. I programmi di Office si registrano quando perdono lo stato attivo. Se un programma tenta di connettersi a un'istanza in esecuzione prima che il programma perda lo stato attivo, è possibile che venga visualizzato un messaggio di errore.

Riferimenti

Per altre informazioni sui diversi comportamenti delle applicazioni di Office quando si usa GetActiveObject, fare clic sul numero dell'articolo seguente per visualizzare l'articolo della Microsoft Knowledge Base:

288902 INFO: GetObject and CreateObject Behavior of Office Automation Servers (Comportamento GetObject e CreateObject dei server di automazione di Office) Per altre informazioni, vedere il seguente sito Web Microsoft Developer Network (MSDN):

Sviluppo di Microsoft Office con Visual Studio