Condividi tramite


Chiamare il codice nei componenti aggiuntivi VSTO da altre soluzioni Office

È possibile esporre un oggetto del componente aggiuntivo VSTO in altre soluzioni, ad esempio in altre soluzioni Microsoft Office. Questa funzionalità è utile se il componente aggiuntivo VSTO fornisce un servizio che si vuole usare anche in altre soluzioni. Ad esempio, se si dispone di un componente aggiuntivo VSTO per Microsoft Office Excel che esegue calcoli sui dati finanziari da un servizio Web, altre soluzioni possono eseguire questi calcoli chiamando il componente aggiuntivo VSTO di Excel in fase di esecuzione.

Si applica a: le informazioni contenute in questo argomento si applicano ai progetti di componente aggiuntivo VSTO. Per altre informazioni, vedere Funzionalità disponibili per app Office lication e tipo di progetto.

Questo processo prevede due passaggi principali:

  • Nel componente aggiuntivo VSTO esporre un oggetto ad altre soluzioni.

  • In un'altra soluzione accedere all'oggetto esposto dal componente aggiuntivo VSTO e chiamare i membri dell'oggetto.

Tipi di soluzioni che possono chiamare il codice in un componente aggiuntivo

È possibile esporre un oggetto in un componente aggiuntivo VSTO ai tipi di soluzioni seguenti:

  • Codice Visual Basic, Applications Edition (VBA) di un documento caricato nello stesso processo dell'applicazione del componente aggiuntivo VSTO.

  • Personalizzazioni a livello di documento caricate nello stesso processo dell'applicazione del componente aggiuntivo VSTO.

  • Altri componenti aggiuntivi VSTO creati usando i modelli di progetto di Office in Visual Studio.

  • Componenti aggiuntivi VSTO COM, ovvero componenti aggiuntivi VSTO che implementano direttamente l'interfaccia IDTExtensibility2 .

  • Qualsiasi soluzione in esecuzione in un processo diverso dal componente aggiuntivo VSTO. Questi tipi di soluzioni sono detti anche client out-of-process. Sono incluse le applicazioni che automatizzano un'applicazione di Office, ad esempio Windows Form o un'applicazione console, e i componenti aggiuntivi VSTO caricati in un processo diverso.

Esporre oggetti ad altre soluzioni

Per esporre un oggetto del componente aggiuntivo VSTO ad altre soluzioni, eseguire la procedura seguente nel componente aggiuntivo:

  1. Definire una classe da esporre ad altre soluzioni.

  2. Eseguire l'override del metodo RequestComAddInAutomationService nella classe ThisAddIn . Restituire un'istanza della classe da esporre ad altre soluzioni.

Definire la classe da esporre ad altre soluzioni

Questa classe deve essere almeno pubblica, deve avere l'attributo ComVisibleAttribute impostato su truee deve esporre l'interfaccia IDispatch .

Il metodo consigliato per esporre l'interfaccia IDispatch consiste nell'eseguire la procedura seguente:

  1. Definire un'interfaccia che dichiari i membri da esporre ad altre soluzioni. È possibile definire questa interfaccia nel progetto di componente aggiuntivo VSTO. È tuttavia consigliabile definire l'interfaccia in un progetto di libreria di classi separato, se si vuole esporre la classe a soluzioni non VBA. In questo modo, le soluzioni che chiamano il componente aggiuntivo VSTO possono fare riferimento all'interfaccia senza fare riferimento al progetto di componente aggiuntivo VSTO.

  2. Applicare l'attributo ComVisibleAttribute a questa interfaccia e impostarlo su true.

  3. Modificare la classe per implementare l'interfaccia.

  4. Applicare l'attributo ClassInterfaceAttribute alla classe e impostare questo attributo sul valore None dell'enumerazione ClassInterfaceType .

  5. Se si vuole esporre questa classe ai client out-of-process, potrebbe essere necessario eseguire le operazioni seguenti:

    • Derivare la classe da StandardOleMarshalObject. Per altre informazioni, vedere Esporre le classi ai client out-of-process.

    • Impostare la proprietà Registra per interoperabilità COM nel progetto in cui si definisce l'interfaccia. Questa proprietà è necessaria solo se si vuole consentire ai client di usare l'associazione anticipata per chiamare il componente aggiuntivo VSTO.

    L'esempio di codice seguente illustra una classe AddInUtilities con un metodo ImportData che è possibile chiamare da altre soluzioni. Per visualizzare questo codice nel contesto di una procedura dettagliata più ampia, vedere Procedura dettagliata: Chiamare il codice in un componente aggiuntivo VSTO da VBA.

    [ComVisible(true)]
    public interface IAddInUtilities
    {
        void ImportData();
    }
    
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class AddInUtilities : IAddInUtilities
    {
        // This method tries to write a string to cell A1 in the active worksheet.
        public void ImportData()
        {
            Excel.Worksheet activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet;
    
            if (activeWorksheet != null)
            {
                Excel.Range range1 = activeWorksheet.get_Range("A1", System.Type.Missing);
                range1.Value2 = "This is my data";
            }
        }
    }
    

Esporre le classi a VBA

Quando si esegue la procedura riportata sopra, il codice VBA può chiamare solo i metodi dichiarati nell'interfaccia. Il codice VBA non può chiamare altri metodi della classe, inclusi i metodi che la classe ottiene dalle classi base, ad esempio Object.

In alternativa, è possibile esporre l'interfaccia IDispatch impostando l'attributo ClassInterfaceAttribute sul valore AutoDispatch o AutoDual dell'enumerazioneClassInterfaceType. Se si espone l'interfaccia, non è necessario dichiarare i metodi in un'interfaccia separata. Il codice VBA può tuttavia chiamare qualsiasi metodo pubblico e non statico della classe, inclusi i metodi ottenuti dalle classi base, ad esempio Object. Inoltre, i client out-of-process che usano l'associazione anticipata non possono chiamare la classe.

Esporre le classi ai client out-of-process

Per esporre una classe del componente aggiuntivo VSTO a client out-of-process, è necessario derivare la classe da StandardOleMarshalObject per assicurarsi che i client out-of-process possano chiamare l'oggetto componente aggiuntivo VSTO esposto. In caso contrario, i tentativi di ottenere un'istanza dell'oggetto esposto in un client out-of-process potrebbero non riuscire in modo imprevisto.

Questo errore è dovuto al fatto che tutte le chiamate al modello a oggetti di un app Office lication devono essere effettuate nel thread principale dell'interfaccia utente, ma le chiamate da un client out-of-process all'oggetto arriveranno su un thread RPC arbitrario (chiamata di routine remota). Il meccanismo di marshalling COM in .NET Framework non cambia thread e tenta invece di effettuare il marshalling della chiamata all'oggetto nel thread RPC in ingresso anziché nel thread principale dell'interfaccia utente. Se l'oggetto è un'istanza di una classe che deriva da StandardOleMarshalObject, viene effettuato automaticamente il marshalling delle chiamate in ingresso all'oggetto in relazione al thread in cui è stato creato l'oggetto esposto, che sarà il thread principale dell'interfaccia utente dell'applicazione host.

Per altre informazioni sull'uso di thread nelle soluzioni Office, vedere Supporto del threading in Office.

Eseguire l'override del metodo RequestComAddInAutomationService

L'esempio di codice seguente illustra come eseguire l'override del metodo RequestComAddInAutomationService nella classe ThisAddIn del componente aggiuntivo VSTO. Nell'esempio si presuppone che sia stata definita una classe denominata AddInUtilities che si vuole esporre ad altre soluzioni. Per visualizzare questo codice nel contesto di una procedura dettagliata più ampia, vedere Procedura dettagliata: Chiamare il codice in un componente aggiuntivo VSTO da VBA.

private AddInUtilities utilities;

protected override object RequestComAddInAutomationService()
{
    if (utilities == null)
        utilities = new AddInUtilities();

    return utilities;
}

Quando viene caricato il componente aggiuntivo VSTO, il Strumenti di Visual Studio per il runtime di Office chiama il RequestComAddInAutomationService metodo . Il runtime assegna l'oggetto restituito alla proprietà COMAddIn.Object di un COMAddIn oggetto che rappresenta il componente aggiuntivo VSTO. Questo oggetto COMAddIn è disponibile per altre soluzioni Office e per soluzioni che automatizzano Office.

Accedere agli oggetti da altre soluzioni

Per chiamare l'oggetto esposto del componente aggiuntivo VSTO, eseguire i passaggi seguenti nella soluzione client:

  1. Ottenere l'oggetto COMAddIn che rappresenta il componente aggiuntivo VSTO esposto. I client possono accedere a tutti i componenti aggiuntivi VSTO disponibili usando la proprietà Application.COMAddIns nel modello a oggetti dell'applicazione host di Office.

  2. Accedere alla proprietà COMAddIn.Object dell'oggetto COMAddIn . Questa proprietà restituisce l'oggetto esposto dal componente aggiuntivo VSTO.

  3. Chiamare i membri dell'oggetto esposto.

    Il modo in cui si usa il valore restituito della proprietà COMAddIn.Object è diverso per i client VBA e i client non VBA. Per i client out-of-process, il codice aggiuntivo è necessario per evitare una possibile race condition.

Accedere agli oggetti dalle soluzioni VBA

Nell'esempio di codice seguente viene illustrato come usare VBA per chiamare un metodo esposto da un componente aggiuntivo VSTO. Questa macro VBA chiama un metodo denominato ImportData definito in un componente aggiuntivo VSTO denominato ExcelImportData. Per visualizzare questo codice nel contesto di una procedura dettagliata più ampia, vedere Procedura dettagliata: Chiamare il codice in un componente aggiuntivo VSTO da VBA.

Sub CallVSTOMethod()
    Dim addIn As COMAddIn
    Dim automationObject As Object
    Set addIn = Application.COMAddIns("ExcelImportData")
    Set automationObject = addIn.Object
    automationObject.ImportData
End Sub

Accedere agli oggetti da soluzioni non VBA

In una soluzione non VBA è necessario eseguire il cast del valore della proprietà COMAddIn.Object all'interfaccia implementata e quindi chiamare i metodi esposti nell'oggetto interfaccia. L'esempio di codice seguente illustra come chiamare il metodo ImportData da un componente aggiuntivo VSTO diverso creato usando gli strumenti di sviluppo per Office in Visual Studio.

object addInName = "ExcelImportData";
Office.COMAddIn addIn = Globals.ThisAddIn.Application.COMAddIns.Item(ref addInName);
ExcelImportData.IAddInUtilities utilities = (ExcelImportData.IAddInUtilities)addIn.Object;
utilities.ImportData();

In questo esempio, se si tenta di eseguire il cast del valore della proprietà COMAddIn.Object alla AddInUtilities classe anziché all'interfaccia IAddInUtilities , il codice genererà un'eccezione InvalidCastException.