Interoperabilitas COM & Runtime Callable Wrapper
Gunakan komponen COM dari C# dengan RCW, impor pustaka tipe, dan tangani pengecualian HRESULT.
Interoperabilitas COM & Runtime Callable Wrapper adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Apa Itu Interoperabilitas COM?
COM (Component Object Model) adalah standar antarmuka biner lama dari Microsoft yang masih digunakan oleh Office, Windows Shell, API lama DirectX, dan banyak alat perusahaan. .NET dapat menggunakan komponen COM melalui wrappers interoperabilitas yang menerjemahkan antara objek terkelola dan antarmuka COM.
Pembungkus yang Dapat Dipanggil Saat Berjalan (RCW)
Saat Anda mengakses objek COM dari .NET, CLR membuat pembungkus yang dapat dipanggil saat berjalan (RCW)—proksi terkelola yang membungkus objek COM. RCW secara otomatis menangani penghitungan referensi (AddRef/Release), pengelolaan utas apartemen, dan pemetaan antara tipe COM dan .NET.
// The RCW is created automatically when you instantiate a COM class
// via a registered ProgID or CLSID
// Example: create an Excel Application COM object
Type excelType = Type.GetTypeFromProgID("Excel.Application")!;
object excelApp = Activator.CreateInstance(excelType)!;
// excelApp is an RCW — the CLR wraps the underlying IDispatch COM object
// COM AddRef is called; CLR tracks references
Console.WriteLine(excelApp.GetType().Name); // ApplicationClassMengimpor Pustaka Tipe (TLB)
Alat tlbimp.exe (Type Library Importer) membaca pustaka tipe COM (.tlb atau yang disematkan dalam .dll) dan menghasilkan rakitan interoperabilitas .NET dengan kelas RCW dan definisi antarmuka bertipe kuat.
// From a Developer Command Prompt:
// tlbimp MyComLib.dll /out:MyComLib.Interop.dll
// Or reference via Visual Studio:
// Add Reference → COM → Microsoft Excel 16.0 Object Library
// → Generates Microsoft.Office.Interop.Excel.dll automatically
// The generated Interop assembly contains:
// - Interface types (matching COM vtable layout)
// - Co-class wrappers (implement the interfaces)
// - Enum types (from the type library)
// - Delegate types for COM event sinksMenggunakan Objek COM melalui Rakitan Interoperabilitas
Setelah mereferensikan rakitan interoperabilitas, tipe COM tampak seperti tipe .NET biasa. Pemanggilan metode diterjemahkan melalui RCW menjadi pengiriman melalui vtable COM. Selalu lepaskan objek COM dengan benar untuk menghindari kebocoran sumber daya.
using Microsoft.Office.Interop.Excel;
Application excel = new Application();
excel.Visible = false;
Workbooks books = excel.Workbooks;
Workbook wb = books.Add();
Worksheet ws = (Worksheet)wb.Sheets[1];
((Range)ws.Cells[1, 1]).Value = "Hello, COM!";
wb.SaveAs(@"C:\Temp\test.xlsx");
wb.Close();
// Release COM RCW explicitly
Marshal.ReleaseComObject(ws);
Marshal.ReleaseComObject(wb);
Marshal.ReleaseComObject(books);
excel.Quit();
Marshal.ReleaseComObject(excel);Marshal.ReleaseComObject
COM menggunakan penghitungan referensi—AddRef/Release. RCW hanya memanggil Release saat dikumpulkan oleh pengumpul sampah, yang mungkin baru terjadi jauh kemudian. Panggil Marshal.ReleaseComObject() untuk segera mengurangi jumlah referensi RCW dan melepaskan objek COM tanpa menunggu pengumpul sampah.
// Pattern: release COM objects in finally block
Application? excel = null;
Workbook? wb = null;
try
{
excel = new Application();
wb = excel.Workbooks.Add();
// ... do work ...
}
finally
{
if (wb != null) Marshal.ReleaseComObject(wb);
if (excel != null)
{
excel.Quit();
Marshal.ReleaseComObject(excel);
}
// Force GC to clean up any remaining RCWs
GC.Collect();
GC.WaitForPendingFinalizers();
}HRESULT dan Pengecualian COM
Metode COM mengembalikan nilai HRESULT untuk menandakan keberhasilan atau kegagalan. RCW secara otomatis memeriksa HRESULT dan melempar COMException (atau pengecualian yang lebih spesifik) jika nilainya menandakan kegagalan. Tangani pengecualian tersebut dengan try/catch biasa.
try
{
// COM method that might fail
Workbook wb = excel.Workbooks.Open(@"C:\missing.xlsx");
}
catch (COMException ex) when (ex.HResult == unchecked((int)0x800A03EC))
{
// Excel-specific HRESULT for file not found
Console.WriteLine($"Excel error: {ex.Message}");
}
catch (COMException ex)
{
// General COM failure
Console.WriteLine($"COM error 0x{ex.HResult:X8}: {ex.Message}");
}Pengikatan Terlambat dengan dynamic
Jika Anda tidak memiliki pustaka tipe atau rakitan interoperabilitas, Anda dapat menggunakan kata kunci C# dynamic untuk pengiriman COM yang terikat terlambat (IDispatch). Cara ini lebih lambat—ID pengiriman ditentukan saat program berjalan—tetapi tidak memerlukan pembungkus yang dihasilkan.
// Late-bound COM via dynamic — no interop DLL needed
Type type = Type.GetTypeFromProgID("Word.Application")!;
dynamic word = Activator.CreateInstance(type)!;
word.Visible = false;
dynamic docs = word.Documents;
dynamic doc = docs.Add();
doc.Content.Text = "Late-bound COM example";
doc.SaveAs2(@"C:\Temp\test.docx");
doc.Close();
word.Quit();
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(docs);
Marshal.ReleaseComObject(word);Penampung Peristiwa COM
Objek COM memicu peristiwa melalui titik koneksi. Rakitan interoperabilitas menghasilkan antarmuka penampung peristiwa. Anda berlangganan menggunakan delegasi/peristiwa .NET biasa, dan RCW menangani infrastruktur IConnectionPoint COM.
using Microsoft.Office.Interop.Excel;
Application excel = new Application();
excel.Visible = true;
// Subscribe to COM event via generated event wrapper
excel.WorkbookBeforeClose += (wb, ref cancel) =>
{
Console.WriteLine($"Closing: {wb.Name}");
// Set cancel = true to prevent close
};
excel.WorkbookOpen += (wb) =>
{
Console.WriteLine($"Opened: {wb.Name}");
};
// Open a workbook to trigger events
excel.Workbooks.Open(@"C:\Temp\test.xlsx");Apartemen COM: STA vs MTA
Banyak komponen COM, terutama yang berkaitan dengan antarmuka pengguna seperti Office, memerlukan apartemen berutas tunggal (STA). Selalu tandai utas yang membuat objek COM STA dengan [STAThread] (Main), atau atur keadaan apartemen utas sebelum memulai utas tersebut.
// Console apps default to MTA — COM Office automation requires STA
// Option 1: Mark Main with [STAThread]
[STAThread]
static void Main()
{
var excel = new Microsoft.Office.Interop.Excel.Application();
// ...
}
// Option 2: Run on an STA thread manually
Thread staThread = new Thread(() =>
{
var excel = new Microsoft.Office.Interop.Excel.Application();
// ...
excel.Quit();
Marshal.ReleaseComObject(excel);
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();ComImport dan Deklarasi COM Manual
Anda dapat mendeklarasikan antarmuka COM secara manual menggunakan atribut [ComImport], [Guid], dan [InterfaceType]—berguna jika tidak ada pustaka tipe atau Anda hanya memerlukan sebagian dari API COM yang besar.
[ComImport]
[Guid("00000000-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IUnknown
{
void QueryInterface(ref Guid riid, out IntPtr ppvObject);
int AddRef();
int Release();
}
// Declare a specific COM interface you want to consume:
[ComImport]
[Guid("0000010C-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IPersist
{
void GetClassID(out Guid pClassID);
}Pemeriksaan Singkat
Apa tujuan pembungkus yang dapat dipanggil saat berjalan (RCW) dalam interoperabilitas COM .NET?
Ringkasan: Interoperabilitas COM dan Pembungkus yang Dapat Dipanggil Saat Berjalan
Poin-poin utama:
- RCW = proksi terkelola yang membungkus objek COM; CLR membuatnya secara otomatis untuk setiap objek COM
- Gunakan
tlbimp.exeatau Referensi VS untuk menghasilkan rakitan interoperabilitas bertipe kuat - Panggil
Marshal.ReleaseComObject()untuk segera melepaskan objek COM, tanpa menunggu pengumpul sampah - Galat COM muncul sebagai
COMExceptiondengan HRESULT asli dynamicmemungkinkan pengiriman COM yang terikat terlambat tanpa rakitan interoperabilitas- Komponen COM Office/antarmuka pengguna memerlukan utas STA—gunakan
[STAThread]atau atur keadaan apartemen
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Interoperabilitas COM & Runtime Callable Wrapper” gratis?
Ya — teks lengkap “Interoperabilitas COM & Runtime Callable Wrapper” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Interoperabilitas COM & Runtime Callable Wrapper”?
Gunakan komponen COM dari C# dengan RCW, impor pustaka tipe, dan tangani pengecualian HRESULT. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Interoperabilitas COM & Runtime Callable Wrapper” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar P/Invoke
- LibraryImport & P/Invoke yang Dibuat dari Sumber
- Kode Tidak Aman, Pointer & Buffer Tetap
- Interoperabilitas COM & Runtime Callable Wrapper