2010-10-28 13 views
5

में किसी प्रकार से फ़ाइल का स्रोत कोड फ़ाइल नाम प्राप्त करें .NET में एक प्रकार ऑब्जेक्ट दिया गया है, क्या मेरे लिए स्रोत कोड फ़ाइल नाम प्राप्त करना संभव है? मुझे पता है कि यह केवल डीबग बिल्ड में उपलब्ध होगा और यह ठीक है, मुझे यह भी पता है कि मैं कॉलस्टैक में किसी विशेष फ्रेम के लिए फ़ाइल नाम प्राप्त करने के लिए स्टैकट्रेस ऑब्जेक्ट का उपयोग कर सकता हूं, लेकिन यह वही नहीं है जो मैं चाहता हूं।डीबग बिल्ड

लेकिन क्या मेरे लिए किसी दिए गए सिस्टम के लिए स्रोत कोड फ़ाइल नाम प्राप्त करना संभव है। टाइप करें?

+0

संभावित डुप्लिकेट [स्रोत फ़ाइल नाम और प्रकार के सदस्य की लाइन संख्या कैसे प्राप्त करें?] (Http://stackoverflow.com/questions/126094/how-to-get-the-source-file-name -और-द-लाइन-नंबर-ऑफ-टाइप-सदस्य) –

+0

आप इसे क्यों चाहते हैं? जिन कारणों से मैं सोच सकता हूं उनमें से अधिकांश को प्रतीक/स्रोत सर्वर जैसे टूल द्वारा हल किया जाएगा ... –

उत्तर

3

यह मानते हुए कि कम से कम सी # आंशिक वर्ग घोषणाओं का समर्थन करता है (कहें, public partial class Foo दो स्रोत कोड फ़ाइलों में), "किसी दिए गए सिस्टम के लिए स्रोत कोड फ़ाइल नाम" का क्या अर्थ होगा? यदि एक ही विधानसभा में एकाधिक स्रोत कोड फ़ाइलों पर एक प्रकार की घोषणा फैली हुई है, तो स्रोत कोड में कोई भी बिंदु नहीं है जहां घोषणा शुरू होती है।

@ डारिन डिमिट्रोव: यह "स्रोत फ़ाइल नाम और प्रकार के सदस्य की लाइन संख्या कैसे प्राप्त करें" के डुप्लिकेट की तरह प्रतीत नहीं होता है? मेरे लिए, क्योंकि यह लगभग सदस्य है, जबकि यह प्रश्न प्रकार है।

+0

हम नाम की जगहों और इस तरह की चीजों की एक बड़ी प्रतिक्रिया कर रहे थे और मैं एक इकाई परीक्षण लिखना चाहता था जिसने जांच की कि नामस्थान मेल खाता है या नहीं स्थान दर्ज करने के लिए। हम वास्तव में अब कर चुके हैं इसलिए मुझे इसकी आवश्यकता नहीं है लेकिन सवाल अभी भी खड़ा है, पीडीबी तक पहुंचने और इस जानकारी को पाने का कोई तरीका होना चाहिए? आंशिक कक्षाओं के लिए, तो हम दोनों फ़ाइल नाम प्राप्त करने में सक्षम होना चाहिए। –

+0

@ माइकल यह 'स्ट्रिंग'] होगा :- डी –

+0

@ सिमोन_वेवर वेल, डुह, लेकिन ओपी ने "दिए गए सिस्टम के लिए *** स्रोत कोड फ़ाइल नाम" टाइप किया। टाइप- :) –

3

मैं इस तरह कोड का उपयोग किया है विधि से एक स्रोत फ़ाइल और लाइन नंबर चल रहा है पाने के लिए:

//must use the override with the single boolean parameter, set to true, to return additional file and line info 

System.Diagnostics.StackFrame stackFrame = (new System.Diagnostics.StackTrace(true)).GetFrames().ToList().First(); 

//Careful: GetFileName can return null even though true was specified in the StackTrace above. This may be related to the OS on which this is running??? 

string fileName = stackFrame.GetFileName(); 
string process = stackFrame.GetMethod().Name + " (" + (fileName == null ? "" : fileName + " ") + fileLineNumber + ")"; 
3

मैं एक ऐसी ही समस्या का सामना करना पड़ा। मुझे केवल एक प्रकार के वर्ग और विधि नाम के साथ एक विशिष्ट विधि का फ़ाइल नाम और रेखा संख्या प्राप्त करने की आवश्यकता थी। मैं एक पुराने मोनो नेट संस्करण (एकता 4.6) पर हूं। मैंने पुस्तकालय सेसिल का उपयोग किया, यह आपके पीबीबी (या मोनो के लिए एमडीबी) का विश्लेषण करने और डीबग प्रतीकों का विश्लेषण करने के लिए कुछ सहायक प्रदान करता है। https://github.com/jbevain/cecil/wiki

एक दिया प्रकार और विधि के लिए:

Mono.Cecil.ReaderParameters readerParameters = new Mono.Cecil.ReaderParameters { ReadSymbols = true }; 
Mono.Cecil.AssemblyDefinition assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(string.Format("Library\\ScriptAssemblies\\{0}.dll", assemblyName), readerParameters); 

string fileName = string.Empty; 
int lineNumber = -1; 

Mono.Cecil.TypeDefinition typeDefinition = assemblyDefinition.MainModule.GetType(myType.FullName); 
for (int index = 0; index < typeDefinition.Methods.Count; index++) 
{ 
    Mono.Cecil.MethodDefinition methodDefinition = typeDefinition.Methods[index]; 
    if (methodDefinition.Name == methodName) 
    { 
     Mono.Cecil.Cil.MethodBody methodBody = methodDefinition.Body; 
     if (methodBody.Instructions.Count > 0) 
     { 
      Mono.Cecil.Cil.SequencePoint sequencePoint = methodBody.Instructions[0].SequencePoint; 
      fileName = sequencePoint.Document.Url; 
      lineNumber = sequencePoint.StartLine; 
     } 
    } 
} 

मैं जानता हूँ कि यह थोड़ा देर हो चुकी है :) लेकिन मुझे आशा है कि यह किसी को मदद मिलेगी:

System.Type myType = typeof(MyFancyClass); 
string methodName = "DoAwesomeStuff"; 

मैं इस समाधान मिल गया!

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