Kode panggilan di Add-in VSTO dari solusi Office lainnya
Anda dapat mengekspos objek di Add-in VSTO Anda ke solusi lain, termasuk solusi Microsoft Office lainnya. Ini berguna jika Add-in VSTO Anda menyediakan layanan yang ingin Anda aktifkan solusi lain untuk digunakan. Misalnya, jika Anda memiliki Add-in VSTO untuk Microsoft Office Excel yang melakukan penghitungan pada data keuangan dari layanan Web, solusi lain dapat melakukan penghitungan ini dengan memanggil add-in Excel VSTO pada durasi.
Berlaku untuk: Informasi dalam topik ini berlaku untuk proyek Add-in VSTO. Untuk informasi selengkapnya, lihat Fitur yang tersedia berdasarkan aplikasi Office likasi dan jenis proyek.
Ada dua langkah utama dalam proses ini:
Di Add-in VSTO Anda, ekspos objek ke solusi lain.
Dalam solusi lain, akses objek yang diekspos oleh Add-in VSTO Anda, dan panggil anggota objek.
Jenis solusi yang dapat memanggil kode dalam add-in
Anda dapat mengekspos objek dalam Add-in VSTO ke jenis solusi berikut:
Kode Visual Basic for Applications (VBA) dalam dokumen yang dimuat dalam proses aplikasi yang sama dengan Add-in VSTO Anda.
Kustomisasi tingkat dokumen yang dimuat dalam proses aplikasi yang sama dengan Add-in VSTO Anda.
Add-in VSTO lainnya yang dibuat dengan menggunakan templat proyek Office di Visual Studio.
Add-in COM VSTO (yaitu, Add-in VSTO yang mengimplementasikan antarmuka secara IDTExtensibility2 langsung).
Solusi apa pun yang berjalan dalam proses yang berbeda dari Add-in VSTO Anda (jenis solusi ini juga dinamai klien yang tidak diproses). Ini termasuk aplikasi yang mengotomatiskan aplikasi Office likasi, seperti aplikasi Formulir Windows atau konsol, dan Add-in VSTO yang dimuat dalam proses yang berbeda.
Mengekspos objek ke solusi lain
Untuk mengekspos objek di Add-in VSTO Anda ke solusi lain, lakukan langkah-langkah berikut di Add-in VSTO Anda:
Tentukan kelas yang ingin Anda ekspos ke solusi lain.
Ambil alih RequestComAddInAutomationService metode di
ThisAddIn
kelas . Mengembalikan instans kelas yang ingin Anda ekspos ke solusi lain.
Tentukan kelas yang ingin Anda ekspos ke solusi lain
Minimal, kelas yang ingin Anda ekspos harus publik, harus memiliki ComVisibleAttribute atribut yang diatur ke true, dan harus mengekspos antarmuka IDispatch .
Cara yang disarankan untuk mengekspos antarmuka IDispatch adalah dengan melakukan langkah-langkah berikut:
Tentukan antarmuka yang mendeklarasikan anggota yang ingin Anda ekspos ke solusi lain. Anda dapat menentukan antarmuka ini di proyek Add-in VSTO Anda. Namun, Anda mungkin ingin menentukan antarmuka ini dalam proyek pustaka kelas terpisah jika Anda ingin mengekspos kelas ke solusi non-VBA, sehingga solusi yang memanggil Add-in VSTO Anda dapat mereferensikan antarmuka tanpa merujuk proyek Add-in VSTO Anda.
Terapkan atribut ke ComVisibleAttribute antarmuka ini, dan atur atribut ini ke true.
Ubah kelas Anda untuk mengimplementasikan antarmuka ini.
Terapkan atribut ke ClassInterfaceAttribute kelas Anda, dan atur atribut ini ke nilai Tidak Ada dari ClassInterfaceType enumerasi.
Jika Anda ingin mengekspos kelas ini ke klien yang tidak diproses, Anda mungkin juga perlu melakukan hal berikut:
Dapatkan kelas dari StandardOleMarshalObject. Untuk informasi selengkapnya, lihat Mengekspos kelas ke klien yang tidak diproses.
Atur properti Daftar untuk interop COM dalam proyek tempat Anda menentukan antarmuka. Properti ini diperlukan hanya jika Anda ingin mengaktifkan klien untuk menggunakan pengikatan awal untuk memanggil add-in VSTO.
Contoh kode berikut menunjukkan
AddInUtilities
kelas denganImportData
metode yang dapat dipanggil oleh solusi lain. Untuk melihat kode ini dalam konteks panduan yang lebih besar, lihat Panduan: Kode panggilan dalam Add-in VSTO dari 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"; } } }
Mengekspos kelas ke VBA
Ketika Anda melakukan langkah-langkah yang disediakan di atas, kode VBA hanya dapat memanggil metode yang Anda nyatakan di antarmuka. Kode VBA tidak dapat memanggil metode lain di kelas Anda, termasuk metode yang diperoleh kelas Anda dari kelas dasar seperti Object.
Anda dapat mengekspos antarmuka IDispatch dengan mengatur ClassInterfaceAttribute atribut ke nilai AutoDispatch atau AutoDual enumerasi ClassInterfaceType . Jika Anda mengekspos antarmuka, Anda tidak perlu mendeklarasikan metode dalam antarmuka terpisah. Namun, kode VBA dapat memanggil metode publik dan non-statis apa pun di kelas Anda, termasuk metode yang diperoleh dari kelas dasar seperti Object. Selain itu, klien di luar proses yang menggunakan pengikatan awal tidak dapat memanggil kelas Anda.
Mengekspos kelas ke klien yang tidak diproses
Jika Anda ingin mengekspos kelas di Add-in VSTO Anda ke klien yang tidak diproses, Anda harus mendapatkan kelas dari StandardOleMarshalObject untuk memastikan bahwa klien di luar proses dapat memanggil objek Add-in VSTO yang diekspos. Jika tidak, upaya untuk mendapatkan instans objek anda yang terekspos di klien di luar proses mungkin gagal secara tak terduga.
Kegagalan ini karena semua panggilan ke dalam model objek aplikasi Office likasi harus dilakukan pada utas UI utama, tetapi panggilan dari klien yang tidak diproses ke objek Anda akan tiba di utas RPC (panggilan prosedur jarak jauh) arbitrer. Mekanisme marshaling COM dalam .NET Framework tidak akan beralih utas, dan sebaliknya akan mencoba untuk melakukan marshal panggilan ke objek Anda pada utas RPC masuk alih-alih utas UI utama. Jika objek Anda adalah instans kelas yang berasal dari StandardOleMarshalObject, panggilan masuk ke objek Anda secara otomatis dinamai ke utas tempat objek yang diekspos dibuat, yang akan menjadi utas UI utama aplikasi host.
Untuk informasi selengkapnya tentang menggunakan utas di solusi Office, lihat Dukungan utas di Office.
Mengambil alih metode RequestComAddInAutomationService
Contoh kode berikut menunjukkan cara mengambil alih RequestComAddInAutomationService di ThisAddIn
kelas di Add-in VSTO Anda. Contoh mengasumsikan bahwa Anda telah menentukan kelas bernama AddInUtilities
yang ingin Anda ekspos ke solusi lain. Untuk melihat kode ini dalam konteks panduan yang lebih besar, lihat Panduan: Kode panggilan dalam Add-in VSTO dari VBA.
private AddInUtilities utilities;
protected override object RequestComAddInAutomationService()
{
if (utilities == null)
utilities = new AddInUtilities();
return utilities;
}
Saat Add-in VSTO Anda dimuat, runtime Visual Studio Tools for Office memanggil RequestComAddInAutomationService metode . Runtime menetapkan objek yang dikembalikan ke properti COMAddIn.Object dari COMAddIn objek yang mewakili Add-in VSTO Anda. Objek ini COMAddIn tersedia untuk solusi Office lainnya, dan untuk solusi yang mengotomatiskan Office.
Mengakses objek dari solusi lain
Untuk memanggil objek yang diekspos di Add-in VSTO Anda, lakukan langkah-langkah berikut dalam solusi klien:
COMAddIn Dapatkan objek yang mewakili Add-in VSTO yang diekspos. Klien dapat mengakses semua Add-in VSTO yang tersedia dengan menggunakan
Application.COMAddIns
properti dalam model objek aplikasi Office likasi host.Akses properti COMAddIn.Object objek COMAddIn . Properti ini mengembalikan objek yang diekspos dari Add-in VSTO.
Panggil anggota objek yang diekspos.
Cara Anda menggunakan nilai pengembalian properti COMAddIn.Object berbeda untuk klien VBA dan klien non-VBA. Untuk klien yang tidak diproses, kode tambahan diperlukan untuk menghindari kemungkinan kondisi balapan.
Mengakses objek dari solusi VBA
Contoh kode berikut menunjukkan cara menggunakan VBA untuk memanggil metode yang diekspos oleh Add-in VSTO. Makro VBA ini memanggil metode bernama ImportData
yang didefinisikan dalam Add-in VSTO yang bernama ExcelImportData. Untuk melihat kode ini dalam konteks panduan yang lebih besar, lihat Panduan: Kode panggilan dalam Add-in VSTO dari VBA.
Sub CallVSTOMethod()
Dim addIn As COMAddIn
Dim automationObject As Object
Set addIn = Application.COMAddIns("ExcelImportData")
Set automationObject = addIn.Object
automationObject.ImportData
End Sub
Mengakses objek dari solusi non-VBA
Dalam solusi non-VBA, Anda harus mentransmisikan nilai properti COMAddIn.Object ke antarmuka yang diterapkannya, lalu Anda dapat memanggil metode yang diekspos pada objek antarmuka. Contoh kode berikut menunjukkan cara memanggil ImportData
metode dari Add-in VSTO berbeda yang dibuat dengan menggunakan alat pengembang Office di Visual Studio.
object addInName = "ExcelImportData";
Office.COMAddIn addIn = Globals.ThisAddIn.Application.COMAddIns.Item(ref addInName);
ExcelImportData.IAddInUtilities utilities = (ExcelImportData.IAddInUtilities)addIn.Object;
utilities.ImportData();
Dalam contoh ini, jika Anda mencoba mentransmisikan nilai properti COMAddIn.Object ke AddInUtilities
kelas daripada IAddInUtilities
antarmuka, kode akan melemparkan InvalidCastException.