0Pricing
C# Academy · Ders

COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları

COM bileşenlerini C#'tan RCW ile kullanmayı, tür kitaplıklarını içe aktarmayı ve HRESULT özel durumlarını ele almayı öğrenin.

COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

COM Birlikte Çalışabilirliği Nedir?

COM (Bileşen Nesne Modeli), Office, Windows Shell, eski DirectX API'leri ve birçok kurumsal araç tarafından hâlâ kullanılan, Microsoft'un eski ikili arayüz standardıdır. .NET, yönetilen nesneler ile COM arayüzleri arasındaki dönüşümü sağlayan birlikte çalışabilirlik sarmalayıcıları aracılığıyla COM bileşenlerini kullanabilir.

Çalışma Zamanı Çağrılabilir Sarmalayıcıları (RCW)

.NET'ten bir COM nesnesine eriştiğinizde CLR, COM nesnesini saran bir Çalışma Zamanı Çağrılabilir Sarmalayıcı (RCW) oluşturur. RCW; başvuru sayımını (AddRef/Release), apartman iş parçacığı modelini ve COM ile .NET türleri arasındaki veri dönüştürmeyi otomatik olarak yönetir.

// 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); // ApplicationClass

Tür Kitaplıklarını İçe Aktarma (TLB)

tlbimp.exe aracı (Tür Kitaplığı İçeri Aktarıcı), bir COM tür kitaplığını (.tlb veya .dll içine gömülü) okur ve güçlü tür denetimli RCW sınıfları ile arayüz tanımları içeren bir .NET birlikte çalışabilirlik derlemesi oluşturur.

// 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 sinks

Birlikte Çalışabilirlik Derlemesiyle COM Nesnesi Kullanma

Birlikte çalışabilirlik derlemesine başvurduğunuzda COM türleri normal .NET türleri gibi görünür. Bir yöntemi çağırmak, RCW aracılığıyla bir COM sanal yöntem tablosuna gönderim yapılmasını sağlar. Kaynak sızıntılarını önlemek için COM nesnelerini her zaman düzgün şekilde serbest bırakın.

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, başvuru sayımı kullanır: AddRef/Release. RCW, Release çağrısını yalnızca çöp toplayıcı tarafından toplanınca yapar; bu çok daha sonra gerçekleşebilir. RCW başvuru sayısını hemen azaltmak ve çöp toplayıcıyı beklemeden COM nesnesini serbest bırakmak için Marshal.ReleaseComObject() çağrısını yapın.

// 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 ve COM Özel Durumları

COM yöntemleri, başarı veya başarısızlığı bildirmek için HRESULT değerleri döndürür. RCW, HRESULT değerini otomatik olarak denetler ve başarısızlığı gösterdiğinde bir COMException (veya daha özel bir özel durum) oluşturur. Bunları olağan try/catch yapısıyla ele alabilirsiniz.

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

dynamic ile Geç Bağlama

Bir tür kitaplığınız veya birlikte çalışabilirlik derlemeniz yoksa, geç bağlamalı COM gönderimi (IDispatch) için C#'ın dynamic anahtar sözcüğünü kullanabilirsiniz. Bu yöntem daha yavaştır; gönderim kimlikleri çalışma zamanında çözümlenir, ancak oluşturulmuş sarmalayıcılar gerektirmez.

// 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);

COM Olay Dinleyicileri

COM nesneleri olayları bağlantı noktaları aracılığıyla tetikler. Birlikte çalışabilirlik derlemesi, olay dinleyicisi arayüzlerini oluşturur. Normal .NET temsilcilerini ve olaylarını kullanarak abone olursunuz; RCW, COM IConnectionPoint altyapısını yönetir.

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");

COM Apartmanları: STA ve MTA

Birçok COM bileşeni (özellikle Office gibi kullanıcı arayüzüyle ilgili olanlar) Tek İş Parçacıklı Apartman (STA) gerektirir. STA COM nesneleri oluşturan iş parçacıklarını her zaman [STAThread] (Main) ile işaretleyin veya iş parçacığını başlatmadan önce apartman durumunu ayarlayın.

// 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 ve El ile COM Bildirimleri

COM arayüzlerini [ComImport], [Guid] ve [InterfaceType] özniteliklerini kullanarak el ile bildirebilirsiniz. Bu, bir tür kitaplığı olmadığında veya büyük bir COM API'sinin yalnızca bir alt kümesine ihtiyaç duyduğunuzda kullanışlıdır.

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

Hızlı Kontrol

.NET COM Birlikte Çalışabilirliğinde Çalışma Zamanı Çağrılabilir Sarmalayıcısının (RCW) amacı nedir?

Özet: COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları

Önemli çıkarımlar:

  • RCW, bir COM nesnesini saran yönetilen vekildir; CLR her COM nesnesi için bunu otomatik olarak oluşturur
  • Güçlü tür denetimli birlikte çalışabilirlik derlemeleri oluşturmak için tlbimp.exe veya VS Başvuruları'nı kullanın
  • COM nesnelerini hemen serbest bırakmak için Marshal.ReleaseComObject() çağrısını yapın (çöp toplayıcıyı beklemeyin)
  • COM hataları, özgün HRESULT içeren COMException olarak ortaya çıkar
  • dynamic, birlikte çalışabilirlik derlemesi olmadan geç bağlamalı COM gönderimini etkinleştirir
  • Office/kullanıcı arayüzü COM bileşenleri STA iş parçacığı gerektirir; [STAThread] kullanın veya apartman durumunu ayarlayın

Sıkça Sorulan Sorular

“COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları” dersi ücretsiz mi?

Evet — “COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları” dersinde ne öğreneceğim?

COM bileşenlerini C#'tan RCW ile kullanmayı, tür kitaplıklarını içe aktarmayı ve HRESULT özel durumlarını ele almayı öğrenin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. P/Invoke Temelleri
  2. LibraryImport ve Kaynak Tarafından Oluşturulan P/Invoke
  3. Güvenli Olmayan Kod, İşaretçiler ve Sabit Tamponlar
  4. COM Birlikte Çalışabilirliği ve Çalışma Zamanı Çağrılabilir Sarmalayıcıları
← C# Academy Sayfasına Dön