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:
Diğer çözümlere göstermek istediğiniz bir sınıf tanımlayın.
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:
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.
özniteliğini ComVisibleAttribute bu arabirime uygulayın ve bu özniteliği true olarak ayarlayın.
Bu arabirimi uygulamak için sınıfınızı değiştirin.
özniteliğini ClassInterfaceAttribute sınıfınıza uygulayın ve bu özniteliği numaralandırmanın None değerine ClassInterfaceType ayarlayın.
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:
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.Nesnesinin COMAddIn.Object özelliğine erişin COMAddIn . Bu özellik, VSTO Eklentisinden kullanıma sunulan nesneyi döndürür.
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.