C# अकादमी · पाठ

COM इंटरऑप और रनटाइम कॉल करने योग्य रैपर

RCW की सहायता से C# से COM घटकों का उपयोग करें, टाइप लाइब्रेरी आयात करें और HRESULT अपवादों को संभालें।

पाठ 4, कुल 4 में से12 चरण

COM इंटरऑप और रनटाइम कॉल करने योग्य रैपर, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

COM इंटरऑपरेबिलिटी क्या है?

COM (Component Object Model) Microsoft का पुराना बाइनरी इंटरफ़ेस मानक है, जिसका उपयोग अब भी Office, Windows Shell, DirectX की पुरानी APIs और अनेक एंटरप्राइज़ उपकरणों में होता है। .NET प्रबंधित ऑब्जेक्ट और COM इंटरफ़ेस के बीच रूपांतरण करने वाले इंटरऑप wrappers के माध्यम से COM घटकों का उपयोग कर सकता है।

रनटाइम कॉल करने योग्य wrappers (RCW)

जब आप .NET से किसी COM ऑब्जेक्ट तक पहुँचते हैं, तो CLR एक Runtime Callable Wrapper (RCW) बनाता है — एक प्रबंधित प्रॉक्सी जो COM ऑब्जेक्ट को लपेटती है। RCW संदर्भ गणना (AddRef/Release), अपार्टमेंट थ्रेडिंग और COM तथा .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); // ApplicationClass

टाइप लाइब्रेरी आयात करना (TLB)

tlbimp.exe उपकरण (Type Library Importer) किसी COM टाइप लाइब्रेरी (.tlb या .dll में एम्बेड की गई) को पढ़ता है और प्रबल रूप से टाइप की गई RCW वर्गों और इंटरफ़ेस परिभाषाओं वाली .NET इंटरऑप असेंबली जनित करता है।

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

इंटरऑप असेंबली के माध्यम से COM ऑब्जेक्ट का उपयोग

इंटरऑप असेंबली का संदर्भ लेने के बाद COM प्रकार सामान्य .NET प्रकारों जैसे दिखाई देते हैं। किसी विधि को कॉल करने पर RCW के माध्यम से COM vtable डिस्पैच में रूपांतरण होता है। संसाधन लीक से बचने के लिए COM ऑब्जेक्ट को हमेशा सही तरीके से रिलीज़ करें।

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 संदर्भ गणना का उपयोग करता है — AddRef/Release। RCW Release को केवल GC द्वारा संग्रहित किए जाने पर कॉल करता है, जो काफी देर से हो सकता है। RCW की संदर्भ गणना तुरंत घटाने और GC की प्रतीक्षा किए बिना COM ऑब्जेक्ट रिलीज़ करने के लिए Marshal.ReleaseComObject() कॉल करें।

// 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 और COM अपवाद

COM विधियाँ सफलता या विफलता का संकेत देने के लिए HRESULT मान लौटाती हैं। RCW HRESULT की स्वचालित रूप से जाँच करता है और विफलता दर्शाने पर COMException (या कोई अधिक विशिष्ट अपवाद) उत्पन्न करता है। इन्हें सामान्य try/catch से संभालें।

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 के साथ लेट बाइंडिंग

यदि आपके पास टाइप लाइब्रेरी या इंटरऑप असेंबली नहीं है, तो लेट-बाउंड COM डिस्पैच (IDispatch) के लिए C# के dynamic कीवर्ड का उपयोग कर सकते हैं। यह धीमा होता है — डिस्पैच ID का समाधान रनटाइम पर होता है — लेकिन इसके लिए जनित wrappers की आवश्यकता नहीं होती।

// 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 इवेंट सिंक

COM ऑब्जेक्ट कनेक्शन पॉइंट के माध्यम से इवेंट भेजते हैं। इंटरऑप असेंबली इवेंट सिंक इंटरफ़ेस जनित करती है। आप सामान्य .NET delegate/इवेंट का उपयोग करके सदस्यता लेते हैं और RCW COM IConnectionPoint की पूरी व्यवस्था संभालता है।

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 अपार्टमेंट: STA बनाम MTA

कई COM घटकों, विशेषकर Office जैसे UI से संबंधित घटकों, के लिए Single-Threaded Apartment (STA) आवश्यक होता है। STA COM ऑब्जेक्ट बनाने वाले थ्रेड को हमेशा [STAThread] (Main) से चिह्नित करें या थ्रेड शुरू करने से पहले उसका अपार्टमेंट स्टेट सेट करें।

// 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 और मैन्युअल COM घोषणाएँ

आप [ComImport], [Guid] और [InterfaceType] एट्रिब्यूट का उपयोग करके COM इंटरफ़ेस मैन्युअल रूप से घोषित कर सकते हैं — यह तब उपयोगी है जब कोई टाइप लाइब्रेरी उपलब्ध न हो या आपको बड़े COM API के केवल एक छोटे हिस्से की आवश्यकता हो।

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

त्वरित जाँच

.NET COM इंटरऑपरेबिलिटी में Runtime Callable Wrapper (RCW) का उद्देश्य क्या है?

पुनरावलोकन: COM इंटरऑपरेबिलिटी और रनटाइम कॉल करने योग्य wrappers

मुख्य बातें:

  • RCW = COM ऑब्जेक्ट को लपेटने वाला प्रबंधित प्रॉक्सी; CLR हर COM ऑब्जेक्ट के लिए इसे स्वचालित रूप से बनाता है
  • प्रबल रूप से टाइप की गई इंटरऑप असेंबली बनाने के लिए tlbimp.exe या VS References का उपयोग करें
  • COM ऑब्जेक्ट तुरंत रिलीज़ करने के लिए Marshal.ReleaseComObject() कॉल करें (GC की प्रतीक्षा न करें)
  • COM त्रुटियाँ मूल HRESULT के साथ COMException के रूप में दिखाई देती हैं
  • इंटरऑप असेंबली के बिना लेट-बाउंड COM डिस्पैच के लिए dynamic का उपयोग किया जा सकता है
  • Office/UI COM घटकों के लिए STA थ्रेड आवश्यक है — [STAThread] का उपयोग करें या अपार्टमेंट स्टेट सेट करें
शुरुआत निःशुल्क

एआई शिक्षक के साथ C# सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
93
पाठ
346

अक्सर पूछे जाने वाले प्रश्न

क्या “COM इंटरऑप और रनटाइम कॉल करने योग्य रैपर” पाठ निःशुल्क है?

हाँ—“COM इंटरऑप और रनटाइम कॉल करने योग्य रैपर” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“COM इंटरऑप और रनटाइम कॉल करने योग्य रैपर” में मैं क्या सीखूँगा?

RCW की सहायता से C# से COM घटकों का उपयोग करें, टाइप लाइब्रेरी आयात करें और HRESULT अपवादों को संभालें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“COM इंटरऑप और रनटाइम कॉल करने योग्य रैपर” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. P/Invoke की मूल बातें
  2. LibraryImport और Source-Generated P/Invoke
  3. असुरक्षित कोड, पॉइंटर और स्थिर बफ़र
  4. COM इंटरऑप और रनटाइम कॉल करने योग्य रैपर
← C# अकादमी पर वापस जाएँ