आपको अपवादों को फेंकना चाहिए। अपवादों को फ्रेमवर्क द्वारा HRESULTS में मैप किया गया है, और HRESULTs COM क्लाइंट में त्रुटियों को वापस करने का मानक तरीका है, इसलिए यह जाने का तरीका है।
प्रत्येक अपवाद प्रकार में एक HResult संपत्ति है। जब COM क्लाइंट से प्रबंधित प्रबंधित कोड अपवाद फेंकता है, तो रनटाइम HResult को COM क्लाइंट में पास करता है। यदि आप एप्लिकेशन-विशिष्ट HRESULT कोड चाहते हैं, तो आप अपना स्वयं का कस्टम अपवाद प्रकार बना सकते हैं और Exception.HResult संपत्ति सेट कर सकते हैं।
ध्यान देने योग्य एक बिंदु यह है कि एक कॉल क्लाइंट को अपवाद को फेंकने पर कॉल स्टैक जानकारी खो जाएगी। इसलिए COM क्लाइंट को प्रचार करने से पहले अपवाद लॉग इन करना एक अच्छा विचार हो सकता है।
एक तकनीक जिसे मैं कभी-कभी उपयोग करता हूं वह निम्नलिखित है: COM क्लाइंट्स के लिए एक कॉमविज़िबल इंटरफेस को स्पष्ट रूप से कार्यान्वित करें जो अपवादों को लॉग और पुनर्स्थापित करता है। COM क्लाइंट कॉमविज़िबल इंटरफ़ेस का उपयोग करते हैं जो उन्हें प्रचारित करने से पहले अपवाद लॉग करता है। .NET क्लाइंट कंक्रीट क्लास का उपयोग करते हैं और अपवाद हैंडलिंग के लिए अपनी व्यवस्था करने की उम्मीद है। यह लिखने के लिए थोड़ा लंबा है लेकिन जब आप बाद में समस्या निवारण कर रहे हों तो सहायक हो सकता है।
इस दृष्टिकोण का एक अन्य लाभ यह है कि आप COM क्लाइंट के लिए COM के प्रतिबंधों के अनुरूप एपीआई और मानक .NET क्लाइंट के लिए एक और मानक API बना सकते हैं। उदाहरण के लिए, COM क्लाइंट संदर्भ द्वारा सरणी पास करने के लिए प्रतिबंधित हैं, जबकि संदर्भ द्वारा गुजरना .NET क्लाइंट के लिए निराश है।
उदाहरण:
[
ComVisible(true),
GuidAttribute("..."),
Description("...")
]
public interface IMyComVisibleClass
{
// Text from the Description attribute will be exported to the COM type library.
[Description("...")]
MyResult MyMethod(...);
[Description("...")]
MyOtherResult MyArrayMethod([In] ref int[] ids,...);
}
...
[
ComVisible(true),
GuidAttribute("..."),
ProgId("..."),
ClassInterface(ClassInterfaceType.None),
Description("...")
]
public class MyComVisibleClass : IMyComVisibleClass
{
public MyResult MyMethod(...)
{
... implementation without exception handling ...
}
public MyOtherResult MyArrayMethod(int[] ids,...)
{
... input parameter does not use ref keyword for .NET clients ...
... implementation without exception handling ...
}
MyResult IMyComVisibleClass.MyMethod(...)
{
// intended for COM clients only
try
{
return this.MyMethod(...);
}
catch(Exception ex)
{
... log exception ...
throw; // Optionally wrap in a custom exception type
}
}
MyOtherResult IMyComVisibleClass.MyArrayMethod(ref int[] ids, ...)
{
// intended for COM clients only
try
{
// Array is passed without ref keyword
return this.MyArrayMethod(ids, ...);
}
catch(Exception ex)
{
... log exception ...
throw; // Optionally wrap in a custom exception type
}
}
}
अपवाद HRESULTS पर मैप किए जाते, तो यह सबसे अच्छा तरीका है। नीचे मेरी प्रतिक्रिया देखें। – Joe