2012-11-14 24 views
7

के साथ मौजूदा सी # -फाइल में प्रोग्रामेटिक रूप से फ़ंक्शन जोड़ें, मैं मौजूदा सी # -फाइल में प्रोग्रामेटिक रूप से एक फ़ंक्शन (एक टेस्टमेड) जोड़ना चाहता हूं। कुछ googling के बाद मुझे लाइब्रेरीऔर CodeModel.AddFunction -Method मिला है, लेकिन मुझे जो चाहिए वह मुझे एक अच्छा उदाहरण नहीं मिल रहा है।एनवीडीटीई

मैं पहले से बनाए गए फ़ंक्शन में और एक विशेषता के साथ कोड के साथ एक फ़ंक्शन जोड़ना चाहता हूं। कुछ इस तरह:

/// <summary> 
/// Documentation 
/// </summary> 
[TestMethod] 
public void TestMethod1() 
{ 
    string test = Helper.CodeExample(); 
} 

किसी को भी मुझे ऐसा करने के तरीके पर एक उदाहरण दिखा सकते हैं?

EDIT: मैं एक सी # फ़ाइल संपादित करना चाहता हूं, जैसे आप टेक्स्ट-फ़ाइल संपादित करेंगे। मुझे पता है कि आप इसे स्ट्रीमवाइटर के साथ कर सकते हैं, लेकिन क्या ऐसा करने के लिए शायद एक बेहतर तरीका है?

+0

आप एक सी # (पाठ) फ़ाइल या सी # (.NET) वर्ग को संशोधित मतलब है:

यह Exec की एक बहुत ही सरल संस्करण है कि आप एक प्रारंभिक बिंदु के रूप में उपयोग कर सकते हैं? संशोधित कोड संकलित कोड को संशोधित करने से बिल्कुल अलग है। – larsmoa

+0

मेरा मतलब है सी # टेक्स्ट-फाइल। यह परीक्षण फाइलें उत्पन्न करने के लिए है। मैं इसे स्ट्रीमवाइटर के साथ कर सकता हूं, लेकिन हालांकि ऐसा करने के लिए शायद एक बेहतर तरीका है। – Mathieu

+0

आपको कुछ ऐसा ढूंढना होगा जो कोड को सिंटैक्स पेड़ में पार्स कर सके, फिर अपने फ़ंक्शन को जोड़ने के लिए उस वाक्यविन्यास पेड़ को अनुकूलित करें और फिर उस वाक्यविन्यास पेड़ से एक नई फ़ाइल जेनरेट करें। –

उत्तर

5

एनवीडीटीई जाने का रास्ता हो सकता है। आप VisualStudio ऐड-इन विकसित कर सकते हैं और फिर Exec विधि को संशोधित कर सकते हैं। इस विधि में आपको सक्रिय दस्तावेज़ और इसके प्रोजेक्ट इटिम प्राप्त करना होगा। यह वह जगह है जहां आपको CodeModel मिलती है जिसमें बहुत से कोड एलिमेंट्स होते हैं। इन तत्वों में से आपको कोड नामस्थान ढूंढना है, और इस तत्व के अंदर CodeClass। यह वह ऑब्जेक्ट है जो नए कोडफंक्शन को वापस करने के लिए AddFunction का जवाब देता है जिसमें आप अपनी विशेषता और कोड जोड़ सकते हैं (यह एक ऐसा हिस्सा है जिसे मुझे बहुत पसंद नहीं है, क्योंकि आपको संपादनपॉइंट का उपयोग करना है)।

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) 
    { 
     handled = false; 
     if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) 
     { 
      handled = true; 
      if (commandName == "TestAddMethod.Connect.TestAddMethod") 
      { 
       Document activeDoc = _applicationObject.ActiveDocument; 
       if (activeDoc == null) 
        return; 
       ProjectItem prjItem = activeDoc.ProjectItem; 
       if (prjItem == null) 
        return; 
       FileCodeModel fcm = prjItem.FileCodeModel; 
       if (fcm == null) 
        return; 

       CodeElements ces = fcm.CodeElements; 
       // look for the namespace in the active document 
       CodeNamespace cns = null; 
       foreach (CodeElement ce in ces) 
       { 
        if (ce.Kind == vsCMElement.vsCMElementNamespace) 
        { 
         cns = ce as CodeNamespace; 
         break; 
        } 
       } 
       if (cns == null) 
        return; 
       ces = cns.Members; 
       if (ces == null) 
        return; 
       // look for the first class 
       CodeClass cls = null; 
       foreach (CodeElement ce in ces) 
       { 
        if (ce.Kind == vsCMElement.vsCMElementClass) 
        { 
         cls = ce as CodeClass; 
         break; 
        } 
       } 
       if (cls == null) 
        return; 
       CodeFunction cf = cls.AddFunction("TestMethod1", vsCMFunction.vsCMFunctionFunction, vsCMTypeRef.vsCMTypeRefVoid, -1, vsCMAccess.vsCMAccessPrivate); 
       cf.AddAttribute("TestMethod", "true"); 
       TextPoint tp = cf.GetStartPoint(vsCMPart.vsCMPartBody); 
       EditPoint ep = tp.CreateEditPoint(); 
       ep.Indent(); 
       ep.Indent(); 
       ep.Indent(); 
       ep.Insert("string test = Helper.CodeExample();"); 
      } 
     } 
    } 
+0

यही वह है जिसे मैं ढूंढ रहा हूं! यह सीएस-फाइल को टेक्स्ट-फ़ाइल की तरह संपादित करने से बेहतर तरीका है। आपका बहुत बहुत धन्यवाद! – Mathieu

+1

यह मेरे लिए एक शानदार प्रारंभिक बिंदु था! धन्यवाद! इंडेंट्स की बजाय 'स्मार्टफॉर्मेट' करने में सक्षम होने के लायक भी ध्यान देने योग्य है। यह 'संपादनपॉइंट' कॉलिंग से शुरू होने वाले कोड की एक श्रृंखला को प्रारूपित करता है और पैरामीटर 'टेक्स्टपॉइंट' पर समाप्त होता है। उपर्युक्त कोड का उपयोग करके यहां एक उदाहरण दिया गया है: 'ep.Insert (" स्ट्रिंग टेस्ट = हेल्पर.कोडएक्स नमूना(); ");' 'tp.CreateEditPoint()। SmartFormat (ep);' – philt5252