Volání kódu v doplňcích VSTO z jiných řešení Office

Objekt v doplňku VSTO můžete vystavit jiným řešením, včetně dalších systém Microsoft Office řešení. To je užitečné v případě, že doplněk VSTO poskytuje službu, kterou chcete povolit jiným řešením. Pokud máte například doplněk VSTO pro systém Microsoft Office Excelu, který provádí výpočty s finančními daty z webové služby, můžou ostatní řešení tyto výpočty provádět voláním doplňku VSTO excelu za běhu.

Platí pro: Informace v tomto tématu platí pro projekty doplňků VSTO. Další informace naleznete v tématu Funkce dostupné aplikace Office lication a typu projektu.

V tomto procesu jsou dva hlavní kroky:

  • V doplňku VSTO zpřístupněte objekt jiným řešením.

  • V jiném řešení získejte přístup k objektu vystaveného doplňkem VSTO a volejte členy objektu.

Typy řešení, která můžou volat kód v doplňku

Objekt v doplňku VSTO můžete vystavit následujícím typům řešení:

  • jazyk Visual Basic for Application kódu (VBA) v dokumentu, který je načten ve stejném procesu aplikace jako váš doplněk VSTO.

  • Přizpůsobení na úrovni dokumentu, která jsou načtena ve stejném procesu aplikace jako doplněk VSTO.

  • Další doplňky VSTO vytvořené pomocí šablon projektů Office v sadě Visual Studio.

  • Doplňky modelu COM VSTO (to znamená doplňky VSTO, které implementují IDTExtensibility2 rozhraní přímo).

  • Jakékoli řešení, které běží v jiném procesu než váš doplněk VSTO (tyto typy řešení se také nazývají klienti mimo proces). Patří mezi ně aplikace, které automatizují aplikace Office licaci, například model Windows Forms nebo konzolovou aplikaci, a doplňky VSTO, které jsou načteny v jiném procesu.

Zveřejnění objektů pro jiná řešení

Pokud chcete zpřístupnit objekt v doplňku VSTO pro jiná řešení, proveďte následující kroky v doplňku VSTO:

  1. Definujte třídu, kterou chcete zpřístupnit jiným řešením.

  2. Přepište metodu RequestComAddInAutomationServiceThisAddIn ve třídě. Vrátí instanci třídy, kterou chcete vystavit jiným řešením.

Definujte třídu, kterou chcete zveřejnit pro jiná řešení.

Minimálně třída, kterou chcete zveřejnit, musí být veřejná, musí mít ComVisibleAttribute atribut nastavený na hodnotu true a musí vystavit rozhraní IDispatch .

Doporučeným způsobem zveřejnění rozhraní IDispatch je provedení následujících kroků:

  1. Definujte rozhraní, které deklaruje členy, které chcete zpřístupnit jiným řešením. Toto rozhraní můžete definovat v projektu doplňku VSTO. Toto rozhraní však můžete chtít definovat v samostatném projektu knihovny tříd, pokud chcete zpřístupnit třídu jiným řešením než VBA, aby řešení, která volají doplněk VSTO, mohla odkazovat na rozhraní bez odkazování na projekt doplňku VSTO.

  2. ComVisibleAttribute Použijte atribut na toto rozhraní a nastavte tento atribut na true.

  3. Upravte třídu tak, aby implementovaly toto rozhraní.

  4. ClassInterfaceAttribute Použijte atribut na vaši třídu a nastavte tento atribut na hodnotu None výčtuClassInterfaceType.

  5. Pokud chcete tuto třídu vystavit klientům mimo proces, možná budete muset provést následující:

    • Odvození třídy z StandardOleMarshalObject. Další informace naleznete v tématu Vystavení tříd klientům mimo proces.

    • Nastavte vlastnost Register for COM interop v projektu, kde definujete rozhraní. Tato vlastnost je nutná pouze v případě, že chcete klientům povolit, aby k volání do doplňku VSTO používali časnou vazbu.

    Následující příklad kódu ukazuje AddInUtilities třídu s metodou ImportData , kterou lze volat jinými řešeními. Pokud chcete tento kód zobrazit v kontextu většího návodu, přečtěte si téma Návod: Volání kódu v doplňku VSTO z jazyka 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";
            }
        }
    }
    

Zveřejnění tříd pro jazyk VBA

Když provedete výše uvedené kroky, kód jazyka VBA může volat pouze metody, které deklarujete v rozhraní. Kód jazyka VBA nemůže volat žádné jiné metody ve vaší třídě, včetně metod, které vaše třída získává ze základních tříd, například Object.

Alternativně můžete zveřejnit rozhraní IDispatch nastavením ClassInterfaceAttribute atributu na AutoDispatch nebo AutoDual hodnotu výčtu ClassInterfaceType . Pokud rozhraní zveřejníte, nemusíte deklarovat metody v samostatném rozhraní. Kód jazyka VBA však může volat jakékoli veřejné a nestatické metody ve vaší třídě, včetně metod získaných ze základních tříd, například Object. Kromě toho nepracují klienti, kteří používají ranou vazbu, nemůžou volat vaši třídu.

Zveřejnění tříd klientům mimo proces

Pokud chcete vystavit třídu v doplňku VSTO pro klienty mimo proces, měli byste třídu odvodit, StandardOleMarshalObject abyste zajistili, že klienti mimo proces můžou volat váš vystavený objekt doplňku VSTO. Jinak se pokusy o získání instance vystaveného objektu v klientovi mimo proces neočekávaně nezdaří.

Toto selhání je způsobeno tím, že všechna volání do objektového modelu aplikace Office lication musí být provedena v hlavním vlákně uživatelského rozhraní, ale volání z klienta mimo proces do objektu dorazí do libovolného vlákna RPC (vzdálené volání procedury). Mechanismus zařazování modelu COM v rozhraní .NET Framework nepřepne vlákna a místo hlavního vlákna uživatelského rozhraní se pokusí zařaďte volání objektu do příchozího vlákna RPC. Pokud je objekt instancí třídy, která je odvozena z StandardOleMarshalObject, příchozí volání objektu se automaticky zařazuje do vlákna, ve kterém byl vystaven objekt vytvořen, což bude hlavní vlákno uživatelského rozhraní hostitelské aplikace.

Další informace o používání vláken v řešeních Office najdete v tématu Podpora threadingu v Office.

Přepsání metody RequestComAddInAutomationService

Následující příklad kódu ukazuje, jak přepsat RequestComAddInAutomationService ve ThisAddIn třídě v doplňku VSTO. V příkladu se předpokládá, že jste definovali třídu s názvem AddInUtilities , kterou chcete zpřístupnit jiným řešením. Pokud chcete tento kód zobrazit v kontextu většího návodu, přečtěte si téma Návod: Volání kódu v doplňku VSTO z jazyka VBA.

private AddInUtilities utilities;

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

    return utilities;
}

Po načtení doplňku VSTO volá visual Studio Tools for Office runtime metodu RequestComAddInAutomationService . Modul runtime přiřadí vrácený objekt comAddIn.Object vlastnost objektu COMAddIn , který představuje váš doplněk VSTO. Tento COMAddIn objekt je k dispozici pro další řešení Office a pro řešení, která automatizují Office.

Přístup k objektům z jiných řešení

Pokud chcete volat vystavený objekt v doplňku VSTO, proveďte v klientském řešení následující kroky:

  1. COMAddIn Získejte objekt, který představuje vystavený doplněk VSTO. Klienti mají přístup ke všem dostupným doplňkům VSTO pomocí Application.COMAddIns vlastnosti v objektovém modelu hostitele aplikace Office lication.

  2. Přístup COMAddIn.Object vlastnost objektu COMAddIn . Tato vlastnost vrátí vystavený objekt z doplňku VSTO.

  3. Volání členů vystaveného objektu

    Způsob použití návratové hodnoty COMAddIn.Object vlastnost se liší pro klienty VBA a klienty jiné než VBA. Pro klienty mimo proces je potřeba další kód, aby se zabránilo možnému stavu časování.

Přístup k objektům z řešení VBA

Následující příklad kódu ukazuje, jak pomocí jazyka VBA volat metodu, která je vystavena doplňkem VSTO. Toto makro jazyka VBA volá metodu definovanou ImportData v doplňku VSTO s názvem ExcelImportData. Pokud chcete tento kód zobrazit v kontextu většího návodu, přečtěte si téma Návod: Volání kódu v doplňku VSTO z jazyka VBA.

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

Přístup k objektům z jiných řešení než VBA

V řešení, které není VBA řešení, musíte přetypovat HODNOTU COMAddIn.Object vlastnost rozhraní, které implementuje, a pak můžete volat vystavené metody v objektu rozhraní. Následující příklad kódu ukazuje, jak volat metodu ImportData z jiného doplňku VSTO, který byl vytvořen pomocí vývojářských nástrojů Office v sadě Visual Studio.

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

V tomto příkladu, pokud se pokusíte přetypovat hodnotu COMAddIn.Object vlastnost třídy AddInUtilities místo IAddInUtilities rozhraní, kód vyvolá .InvalidCastException