Diğer Office çözümlerinden VSTO Eklentileri'nde kod çağırma

VSTO Eklentinizdeki bir nesneyi, diğer Microsoft Office çözümleri de dahil olmak üzere diğer çözümlere kullanıma salayabilirsiniz. VSTO Eklentiniz diğer çözümlerin kullanılmasını sağlamak istediğiniz bir hizmet sağlıyorsa bu yararlı olur. Örneğin, Bir Web hizmetinden finansal veriler üzerinde hesaplamalar yapan bir Microsoft Office Excel VSTO Eklentiniz varsa, diğer çözümler çalışma zamanında Excel VSTO Eklentisi'ne arayarak bu hesaplamaları gerçekleştirebilir.

Şunlar için geçerlidir: Bu konudaki bilgiler VSTO Eklenti projeleri için geçerlidir. Daha fazla bilgi için bkz. Office uygulaması ve proje türüne göre kullanılabilen özellikler.

Bu işlemin iki ana adımı vardır:

  • VSTO Eklentinizde bir nesneyi diğer çözümlere kullanıma salar.

  • Başka bir çözümde VSTO Eklentiniz tarafından sunulan nesneye erişin ve nesnenin üyelerini çağırın.

Eklentide kod çağırabilen çözüm türleri

VSTO Eklentisindeki bir nesneyi aşağıdaki çözüm türleriyle kullanıma sunun:

  • VSTO Eklentinizle aynı uygulama işleminde yüklenen bir belgedeki Visual Basic for Applications (VBA) kodu.

  • VSTO Eklentinizle aynı uygulama işleminde yüklenen belge düzeyinde özelleştirmeler.

  • Visual Studio'da Office proje şablonları kullanılarak oluşturulan diğer VSTO Eklentileri.

  • COM VSTO Eklentileri (yani arabirimi doğrudan uygulayan IDTExtensibility2 VSTO Eklentileri).

  • VSTO Eklentinizden farklı bir işlemde çalışan tüm çözümler (bu tür çözümler de işlem dışı istemciler olarak adlandırılır). Bunlar, Windows Forms veya konsol uygulaması gibi bir Office uygulaması otomatikleştirmeyi otomatik hale getiren uygulamaları ve farklı bir işlemde yüklenen VSTO Eklentilerini içerir.

Nesneleri diğer çözümlere sunma

VSTO Eklentinizdeki bir nesneyi diğer çözümlerde kullanıma açmak için VSTO Eklentinizde aşağıdaki adımları gerçekleştirin:

  1. Diğer çözümlere göstermek istediğiniz bir sınıf tanımlayın.

  2. sınıfındaki RequestComAddInAutomationService yöntemini ThisAddIn geçersiz kılın. Diğer çözümlere göstermek istediğiniz sınıfın bir örneğini döndürür.

Diğer çözümlere göstermek istediğiniz sınıfı tanımlayın

En azından, kullanıma açmak istediğiniz sınıfın genel olması, özniteliğinin ComVisibleAttribute true olarak ayarlanmış olması ve IDispatch arabirimini kullanıma sunması gerekir.

IDispatch arabirimini kullanıma sunmanın önerilen yolu aşağıdaki adımları gerçekleştirmektir:

  1. Diğer çözümlere göstermek istediğiniz üyeleri bildiren bir arabirim tanımlayın. Bu arabirimi VSTO Eklenti projenizde tanımlayabilirsiniz. Ancak, sınıfı VBA dışı çözümlerle kullanıma açmak istiyorsanız bu arabirimi ayrı bir sınıf kitaplığı projesinde tanımlamak isteyebilirsiniz; böylece VSTO Eklentinizi çağıran çözümler VSTO Eklenti projenize başvurmadan arabirime başvurabilir.

  2. özniteliğini ComVisibleAttribute bu arabirime uygulayın ve bu özniteliği true olarak ayarlayın.

  3. Bu arabirimi uygulamak için sınıfınızı değiştirin.

  4. özniteliğini ClassInterfaceAttribute sınıfınıza uygulayın ve bu özniteliği numaralandırmanın None değerine ClassInterfaceType ayarlayın.

  5. Bu sınıfı işlem dışı istemcilerde kullanıma açmak istiyorsanız, aşağıdakileri de yapmanız gerekebilir:

    • sınıfından türetilir StandardOleMarshalObject. Daha fazla bilgi için bkz . Sınıfları işlem dışı istemcilere sunma.

    • Arabirimini tanımladığınız projede COM birlikte çalışma için Kaydet özelliğini ayarlayın. Bu özellik yalnızca istemcilerin VSTO Eklentisi'ne çağrı yapmak için erken bağlama kullanmasını sağlamak istiyorsanız gereklidir.

    Aşağıdaki kod örneği, diğer çözümler tarafından çağrılabilen bir yönteme sahip bir ImportData sınıfı gösterirAddInUtilities. Bu kodu daha büyük bir izlenecek yol bağlamında görmek için bkz . İzlenecek yol: VBA'dan VSTO Eklentisinde kod çağırma.

    [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";
            }
        }
    }
    

Sınıfları VBA'da kullanıma sunma

Yukarıda sağlanan adımları gerçekleştirdiğinizde VBA kodu yalnızca arabirimde bildirdiğiniz yöntemleri çağırabilir. VBA kodu, sınıfınızın gibi Objecttemel sınıflardan aldığı yöntemler de dahil olmak üzere sınıfınızdaki diğer yöntemleri çağıramaz.

Alternatif olarak, özniteliğini sabit listesinin AutoDispatch veya AutoDual değerine ayarlayarak ClassInterfaceAttribute IDispatch arabirimini ClassInterfaceType kullanıma sağlayabilirsiniz. Arabirimini kullanıma sunarsanız, yöntemleri ayrı bir arabirimde bildirmeniz gerekmez. Ancak VBA kodu, gibi Objecttemel sınıflardan alınan yöntemler de dahil olmak üzere sınıfınızdaki tüm genel ve statik olmayan yöntemleri çağırabilir. Ayrıca, erken bağlama kullanan işlem dışı istemciler sınıfınızı çağıramaz.

Sınıfları işlem dışı istemcilere sunma

VSTO Eklentinizdeki bir sınıfı işlem dışı istemcilerde kullanıma açmak istiyorsanız, işlem dışı istemcilerin kullanıma sunulan VSTO Eklenti nesnenizi çağıradığından emin olmak için sınıfından StandardOleMarshalObject türetmelisiniz. Aksi takdirde, kullanıma sunulan nesnenizin bir örneğini işlem dışı bir istemcide alma girişimleri beklenmedik bir şekilde başarısız olabilir.

Bunun nedeni, bir Office uygulaması lication nesne modeline yapılan tüm çağrıların ana ui iş parçacığında yapılması gerekir, ancak işlem dışı bir istemciden nesnenize yapılan çağrılar rastgele bir RPC (uzak yordam çağrısı) iş parçacığına ulaşır. .NET Framework'teki COM hazırlama mekanizması iş parçacıklarını değiştirmez ve bunun yerine ana kullanıcı arabirimi iş parçacığı yerine gelen RPC iş parçacığında nesnenize yapılan çağrıyı hazırlamayı dener. Nesneniz öğesinden StandardOleMarshalObjecttüretilen bir sınıfın örneğiyse, nesnenize gelen çağrılar otomatik olarak sunulan nesnenin oluşturulduğu iş parçacığına sıralanır ve bu, konak uygulamanın ana ui iş parçacığı olur.

Office çözümlerinde iş parçacıklarını kullanma hakkında daha fazla bilgi için bkz . Office'te iş parçacığı desteği.

RequestComAddInAutomationService yöntemini geçersiz kılma

Aşağıdaki kod örneği, VSTO Eklentinizdeki sınıfta geçersiz kılma RequestComAddInAutomationService işlemini ThisAddIn gösterir. Örnekte, diğer çözümlere göstermek istediğiniz adlı AddInUtilities bir sınıf tanımladığınız varsayılır. Bu kodu daha büyük bir izlenecek yol bağlamında görmek için bkz . İzlenecek yol: VBA'dan VSTO Eklentisinde kod çağırma.

private AddInUtilities utilities;

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

    return utilities;
}

VSTO Eklentiniz yüklendiğinde, Office çalışma zamanı için Visual Studio Araçları yöntemini çağırırRequestComAddInAutomationService. Çalışma zamanı, döndürülen nesneyi VSTO Eklentinizi temsil eden bir COMAddIn nesnenin COMAddIn.Object özelliğine atar. Bu COMAddIn nesne, diğer Office çözümleri ve Office'i otomatik hale getiren çözümler için kullanılabilir.

Diğer çözümlerden nesnelere erişme

VSTO Eklentinizde kullanıma sunulan nesneyi çağırmak için istemci çözümünde aşağıdaki adımları gerçekleştirin:

  1. COMAddIn Kullanıma sunulan VSTO Eklentisini temsil eden nesneyi alın. İstemciler, konak Office uygulaması lication nesne modelindeki özelliğini kullanarak Application.COMAddIns tüm kullanılabilir VSTO Eklentilerine erişebilir.

  2. Nesnesinin COMAddIn.Object özelliğine erişin COMAddIn . Bu özellik, VSTO Eklentisinden kullanıma sunulan nesneyi döndürür.

  3. Kullanıma sunulan nesnenin üyelerini çağırın.

    COMAddIn.Object özelliğinin dönüş değerini kullanma şekliniz VBA istemcileri ve VBA olmayan istemciler için farklıdır. İşlem dışı istemciler için olası bir yarış durumundan kaçınmak için ek kod gereklidir.

VBA çözümlerinden nesnelere erişme

Aşağıdaki kod örneğinde VSTO Eklentisi tarafından kullanıma sunulan bir yöntemi çağırmak için VBA'nın nasıl kullanılacağı gösterilmektedir. Bu VBA makro, ExcelImportData adlı ImportData bir VSTO Eklentisinde tanımlanan adlı bir yöntemi çağırır. Bu kodu daha büyük bir izlenecek yol bağlamında görmek için bkz . İzlenecek yol: VBA'dan VSTO Eklentisinde kod çağırma.

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

VBA olmayan çözümlerden nesnelere erişme

VBA olmayan bir çözümde, COMAddIn.Object özellik değerini uyguladığı arabirime atamanız gerekir ve ardından arabirim nesnesinde kullanıma sunulan yöntemleri çağırabilirsiniz. Aşağıdaki kod örneği, Visual Studio'daki Office geliştirici araçları kullanılarak oluşturulan farklı bir VSTO Eklentisinden yönteminin nasıl çağrıldığını ImportData gösterir.

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

Bu örnekte, COMAddIn.Object özelliğinin değerini arabirim yerine IAddInUtilities sınıfına atamaya AddInUtilities çalışırsanız, kod bir InvalidCastExceptionoluşturur.