2012-06-14 14 views
16

में "एप्लिकेशन" इंटरफ़ेस को तुरंत चालू करने में सक्षम क्यों हूं, मेरे पास मेरे आवेदन में निम्न C# कोड है जो ठीक काम करता है। यह एक्सेल का एक नया उदाहरण लॉन्च करता है।कृपया बताएं कि मैं Excel VSTO

private readonly Microsoft.Office.Interop.Excel.Application _application; 
_application = new Microsoft.Office.Interop.Excel.Application(); 
_application.Visible = true; 

मैंने हाल ही में देखा है कि Application एक इंटरफ़ेस प्रकार है। वास्तव में क्या चल रहा है और यह कैसे संभव है?

उत्तर

26

संकलक अगर वे (एक ComImport और एक Guid के रूप में भी) एक CoClass विशेषता ठोस वर्ग है कि उन्हें लागू करता है की पहचान करने के साथ सजाया जाएगा तो आप उसे इंटरफेस का दृष्टांत देता है। जब आप इंटरफ़ेस को तुरंत चालू करते हैं, तो आप वास्तव में इस ठोस वर्ग को पीछे के दृश्यों को तुरंत चालू कर देंगे।

यह "फीचर" का उद्देश्य COM आयातित प्रकारों के लिए नलसाजी के रूप में उपयोग किया जाना है। गौर करें कि आउटलुक Application इंटरफ़ेस ApplicationClass नाम के एक ठोस वर्ग के द्वारा समर्थित है:

[GuidAttribute("00063001-0000-0000-C000-000000000046")] 
[CoClassAttribute(typeof(ApplicationClass))] 
public interface Application : _Application, ApplicationEvents_11_Event 

अधिकांश परिस्थितियों में, आप अपने स्वयं के इंटरफेस को इन विशेषताओं को लागू करने नहीं जाना चाहिए। हालांकि, प्रदर्शन के लिए, हम दिखा सकते हैं कि कंपाइलर आपको अपने कोड में इंटरफेस को तत्काल करने के लिए इस संभावना का लाभ उठाने की अनुमति देता है। निम्नलिखित सरल उदाहरण पर विचार करें (GUID यादृच्छिक है):

IFoo a = new IFoo(); 
Console.WriteLine(a.Bar()); 
// Output: "Hello world" 

संपादित:: हालांकि jonnyGold सही ढंग से नोटों

[ComImport] 
[Guid("175EB158-B655-11E1-B477-02566188709B")] 
[CoClass(typeof(Foo))] 
interface IFoo 
{ 
    string Bar(); 
} 

class Foo : IFoo 
{ 
    public string Bar() 
    { 
     return "Hello world"; 
    } 
} 

ऊपर घोषणाओं का उपयोग करना, आप अपने खुद के IFoo इंटरफ़ेस का एक उदाहरण बना सकते हैं कि एक्सेल Application उदाहरण एमएसडीएन पर CoClass के साथ सजाया नहीं गया है, यह एक एमएसडीएन चूक है। Microsoft.Office.Interop.Excel विधानसभा से decompiled हस्ताक्षर है:

[CoClass(typeof(ApplicationClass)), Guid("000208D5-0000-0000-C000-000000000046")] 
[ComImport] 
public interface Application : _Application, AppEvents_Event 
+0

स्पष्ट स्पष्टीकरण के लिए धन्यवाद। अब मैं सोच रहा हूं कि "क्यों?", लेकिन मुझे लगता है कि COM इंटरऑप की अच्छी समझ उस के लिए पूर्व-आवश्यकता होगी। –

+0

मेरा असंतुलित अनुमान यह है कि COM के साथ इंटरऑपरेट करते समय यह कुछ विरासत आवश्यकताओं को संबोधित करने के लिए .NET संकलक में "हैक" पेश किया गया था। – Douglas

+0

[इस] के अनुसार (http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.application.aspx) 'माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल.एप्लिकेशंस' सजाया नहीं गया है 'CoClassAttribute' के साथ, लेकिन यह होना चाहिए। बेशक, मैंने सवाल में डॉटपीक का उपयोग नहीं किया है। – bluevector

-2

क्योंकि MSDN तो कहते हैं:

उदाहरण के लिए, निम्न कोड एक्सेल Microsoft.Office.Interop.Excel.Application इंटरफ़ेस का उपयोग करता। रन समय पर, यह एक्सेल एप्लिकेशन ऑब्जेक्ट को चालू करने और वर्कशीट खोलने के लिए एप्लिकेशन क्लास का उपयोग करता है।

+2

शायद ही कोई संतोषजनक जवाब ... MSDN भी कहते हैं – Douglas

+0

सहमत "एक इंटरफेस सीधे instantiated नहीं किया जा सकता है।"। आलेख यह नहीं समझाता कि यह वाक्य रचनात्मक रूप से मान्य है। पुस्तकालय दस्तावेज भी नहीं करता है। – bluevector

संबंधित मुद्दे