Bagikan melalui


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:

  1. Tentukan kelas yang ingin Anda ekspos ke solusi lain.

  2. 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:

  1. 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.

  2. Terapkan atribut ke ComVisibleAttribute antarmuka ini, dan atur atribut ini ke true.

  3. Ubah kelas Anda untuk mengimplementasikan antarmuka ini.

  4. Terapkan atribut ke ClassInterfaceAttribute kelas Anda, dan atur atribut ini ke nilai Tidak Ada dari ClassInterfaceType enumerasi.

  5. Jika Anda ingin mengekspos kelas ini ke klien yang tidak diproses, Anda mungkin juga perlu melakukan hal berikut:

    Contoh kode berikut menunjukkan AddInUtilities kelas dengan ImportData 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:

  1. 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.

  2. Akses properti COMAddIn.Object objek COMAddIn . Properti ini mengembalikan objek yang diekspos dari Add-in VSTO.

  3. 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.