2010-02-25 17 views
23

यह है कि आप एक ऐड-इन से वर्तमान समाधान निर्देशिका कैसे प्राप्त करेंगे:VSPackage से आप वर्तमान समाधान निर्देशिका कैसे प्राप्त करते हैं?

_applicationObject = (DTE2)application; // retrieved from OnConnection method 
string solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName); 

आप इसे VSPackage के माध्यम से कैसे करेंगे?

मैं एक वीएसपीकेज में एक दृश्य स्टूडियो ऐड-इन माइग्रेट कर रहा हूं क्योंकि मैं कुछ उपयोगकर्ता नियंत्रण जोड़ने का इरादा रख रहा हूं जिसके लिए आईडीई के साथ गहन एकीकरण की आवश्यकता है।

मुझे ऐड-इन्स बनाम एकीकरण पैकेज के सापेक्ष गुणों पर कुछ अच्छे संदर्भ मिले हैं जैसे: http://nayyeri.net/visual-studio-addin-vs-integration-package-part-1

और VSPackages पर msdn पर कुछ अच्छे ट्यूटोरियल जैसे: http://msdn.microsoft.com/en-us/library/cc138589.aspx

I haven VSPackages में निम्न स्तर इंटरफेस के लिए ऐड-इन्स (जैसे डीटीई) मानचित्र में उच्च स्तर इंटरफेस कैसे करता है, इस पर अभी तक एक अच्छा संदर्भ नहीं मिला है (एमएसडीएन या अन्यथा)।

एड-इन इंटरफेस से VSPackage इंटरफेस में सामान्य मैपिंग के साथ मदद करने के लिए वहां कोई अच्छा संदर्भ है?

+0

2+ प्रश्न और उत्तर मेरी रुचियों के लिए प्रासंगिक हैं। – Terrance

उत्तर

23

मुझे विशिष्ट प्रश्न का उत्तर मिला। VisualStudio.DTE वस्तु GetService() विधि के माध्यम से प्राप्त किया जा सकता है:

// Get an instance of the currently running Visual Studio IDE 
DTE dte = (DTE)GetService(typeof(DTE)); 
string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
+1

क्या इस कोड में कोई समस्या है जब दृश्य स्टूडियो की कई प्रतियां चल रही हैं? – Maslow

+0

मैंने मानक और हाइबरनेट मोड में वीएस के कई उदाहरणों के साथ उपयोग किया है और सही वर्तमान समाधान प्राप्त करने में किसी भी समस्या का सामना नहीं किया है। इससे पहले कि मैंने कोशिश की कि डीआईडी ​​को सही उदाहरण प्राप्त करने में परेशानी हो, जैसे: डीटीई डीटी = (डीटीई) सिस्टम। रनटाइम.इंटरोप सर्विसेज। मार्शल.गेटएक्टिव ऑब्जेक्ट ("विजुअलस्टूडियो.डीटीई"); स्ट्रिंग समाधान डीआईआर = System.IO.Path.GetDirectoryName (dte.Solution.FullName); –

7

आप इन कार्यों में से एक से एक DTE वस्तु प्राप्त कर सकते हैं:

public static DTE GetCurrentDTE(IServiceProvider provider) 
{ 
    /*ENVDTE. */DTE vs = (DTE)provider.GetService(typeof(DTE)); 
     if (vs == null) throw new InvalidOperationException("DTE not found."); 
    return vs; 
} 

public static DTE GetCurrentDTE() 
{ 
    return GetCurrentDTE(/* Microsoft.VisualStudio.Shell. */ServiceProvider.GlobalProvider); 
} 

उसके बाद, आप सक्रिय Solution से प्राप्त कर सकते हैं DTE.Solution और SolutionDTE.Solution.Path संपत्ति से पथ।

+1

अच्छा कोड। अब मुझे पता है कि वह डीटीई ऑब्जेक्ट कैसे प्राप्त करें। लेकिन मैं एक IServiceProvider कैसे प्राप्त करूं (जब विजुअल स्टूडियो एक्सटेंशन नहीं लिख रहा हो)। – Vaccano