.cs फ़ाइल (रनटाइम पर) से एक विशिष्ट विधि स्रोत कोड प्राप्त करना

1 - I have this file content on the disc (cs file, not compiled):

    namespace Test
    {
        using System;
        public class TestClass 
        {
            public string SomeTestMethod(){
                return "test here";
            }
        }
    }

मैं एक चर चर में रन टाइम में कैसे प्राप्त करूं:

public string SomeTestMethod(){
    return "test here";
}

for example: SourceCodeParser.GetMothod("path to file","SomeTestMethod");

2 - Is it possible the content of accessor member?

   public string SomeMember {
        get {
            return "test here";
        }
    }
0
@MichaelPerrenoud - धन्यवाद, लेकिन नहीं। मैं एक एचटीएमएल पेज में विधि दिखाना चाहता हूँ।
जोड़ा लेखक SexyMF, स्रोत
क्या आप परीक्षण उद्देश्यों के लिए कार्यान्वयन को फिक्र करने के बारे में बात कर रहे हैं? उस मामले में नए माइक्रोसॉफ्ट फॉक्स फ्रेमवर्क का उपयोग करें क्योंकि यह वर्ग स्वाभाविक रूप से परीक्षण योग्य नहीं है।
जोड़ा लेखक Mike Perrenoud, स्रोत

3 उत्तर

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

कार्यक्रम परिवर्तन (पीटी) उपकरण (जो अक्सर पहले से ही ऐसे पूर्ण पार्सर्स उपलब्ध होते हैं) अक्सर स्मृति में एएसटी बनाकर ऐसा करते हैं जो कोड का प्रतिनिधित्व करता है। फिर, नाम लुकअप के लिए नियम दिए गए हैं, नाम से एएसटी में कोड ढूंढना अपेक्षाकृत सरल है, और कोई भी इस तरह के टूल के सुंदरप्रिंट फ़ंक्शन का उपयोग कर नाम-इकाई को बफर/स्ट्रिंग/डिस्कफाइल में जहां कहीं भी पार्क करना चाहता है, को प्रिंट करने के लिए उपयोग कर सकता है ।

आपको एक पीटी को एक सबराउटिन के रूप में ढूंढने की संभावना नहीं है जिसे आप सी # से सीधे कॉल कर सकते हैं। आप अपने प्रोग्राम से ऐसे टूल का आह्वान करने में सक्षम हो सकते हैं, और इसे स्ट्रिंग को टेक्स्ट परिणाम/फ़ाइल में/पाइप के माध्यम से वापस ले सकते हैं जो भी आपको लगता है कि इंटरप्रोसेस संचार के लिए सबसे अच्छा है।

यदि आप किसी HTML पृष्ठ में एम्बेड किए गए विधि टेक्स्ट को दिखाना चाहते हैं, तो आप अक्सर पीटी को कॉन्फ़िगर कर सकते हैं ताकि पूरे पृष्ठ को सुंदर मुद्रित इकाई टेक्स्ट बनाया जा सके। (इस तरह के उदाहरण के लिए मेरे जैव के माध्यम से जावासोर्स ब्राउज़र देखें)।

0
जोड़ा

.NET प्रतिबिंब वर्ग सी # को अपघटन का समर्थन नहीं करता है। सबसे अच्छा आप कर सकते हैं MMethodInfo.GetMethodBody() का उपयोग करें और प्रतिक्रिया पर MethodBody.GetILAsByteArray() पर कॉल करें। वह आपको देगा एमएसआईएल जो सबसे अच्छा है .NET प्रतिबिंब आपको दे सकता है।

सी # को डिकंपाइल करने के लिए आपको एक डिकंपेलर की आवश्यकता होगी - जिसमें से कम से कम एक दर्जन वैध विकल्प हैं। आपको अपनी आवश्यकताओं और बजट को पूरा करने वाले व्यक्ति की जांच करनी होगी।

एक विकल्प लाल गेट का .NET परावर्तक है। निक हैरिसन के पास एक है HTML कोड के रूप में स्रोत कोड प्रस्तुत करने के लिए किसी एप्लिकेशन में .NET परावर्तक का उपयोग करने पर लंबा और संपूर्ण लेख

0
जोड़ा

Roslyn is what you need. You can easily install it using nuget. Here is a working code for getting a method body:

string GetMethod(string filename, string methodName)
{
    var syntaxTree = SyntaxTree.ParseFile(filename);
    var root = syntaxTree.GetRoot();
    var method = root.DescendantNodes()
                     .OfType()
                     .Where(md => md.Identifier.ValueText.Equals(methodName))
                     .FirstOrDefault();
    return method.ToString();
}

और संपत्ति गेटटर के शरीर के लिए कोड:

string GetPropertyGetter(string filename, string propertyName)
{
    var syntaxTree = SyntaxTree.ParseFile(filename);
    var root = syntaxTree.GetRoot();
    var property = root.DescendantNodes()
                       .OfType()
                       .Where(md => md.Identifier.ValueText.Equals(propertyName))
                       .FirstOrDefault();
    var getter = property.AccessorList.Accessors.First(a => a.Kind == SyntaxKind.GetAccessorDeclaration);
    return getter.ToString();
}
0
जोड़ा
धन्यवाद, यह अच्छा लग रहा है, क्या इसे डीएलएल के लिए पथ की आवश्यकता होगी? या स्रोत फ़ाइल के लिए पथ? धन्यवाद
जोड़ा लेखक SexyMF, स्रोत
यह स्रोत फ़ाइल ( .cs ) को पार करता है, कोई DLL आवश्यक नहीं है।
जोड़ा लेखक Konrad Kokosa, स्रोत
एपीआई बदल गया है और यह कोड नहीं चलेगा, CSharpSyntaxTree.ParseText को आजमाएं stackoverflow.com/a/31342480/2257488
जोड़ा लेखक Chrille, स्रोत