संपादित करें: मैंने परिणामों को एक ब्लॉग पोस्ट के रूप में लिखा है ।
C # कंपाइलर COM प्रकार को कुछ जादुई तरीके से व्यवहार करता है। उदाहरण के लिए, यह कथन सामान्य लग रहा है ...
Word.Application app = new Word.Application();
... जब तक आप महसूस करते हैं कि Application
यह एक इंटरफ़ेस है। एक इंटरफ़ेस पर एक निर्माता को बुला रहा है? Yoiks! यह वास्तव में एक कॉल में Type.GetTypeFromCLSID()
और दूसरे में अनुवाद हो जाता है Activator.CreateInstance
।
इसके अतिरिक्त, C # 4 में, आप ref
मापदंडों के लिए गैर-रेफरी तर्क का उपयोग कर सकते हैं , और संकलक सिर्फ संदर्भ द्वारा पारित करने के लिए एक स्थानीय चर जोड़ता है, परिणाम को छोड़ते हुए:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(हाँ, दलीलों का एक समूह गायब है। वैकल्पिक पैरामीटर अच्छे नहीं हैं? :)
मैं संकलक व्यवहार की जांच करने की कोशिश कर रहा हूं, और मैं पहले भाग को नकली करने में विफल रहा हूं। मैं बिना किसी समस्या के दूसरा भाग कर सकता हूं:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
मैं लिखना चाहूंगा:
Dummy dummy = new Dummy();
हालांकि। जाहिर है यह निष्पादन के समय धमाकेदार होगा, लेकिन यह ठीक है। मैं सिर्फ प्रयोग कर रहा हूं।
लिंक किए गए COM PIA ( CompilerGenerated
और TypeIdentifier
) के लिए संकलक द्वारा जोड़े गए अन्य गुण चाल नहीं लगते ... जादू की चटनी क्या है?
dynamic
... हम अभी भी स्थिर / मजबूत टाइपिंग के लिए उपयोग कर रहे हैं यह देखने के लिए कि यह COM के बाहर क्यों बात करेगा।