2011-11-21 5 views
5

निर्धारित करें कि मैं जांचना चाहता हूं कि कुछ वर्गों (बाइट्स में) का संकलित कोड कितना बड़ा है। मैं उन्हें आकार के लिए अनुकूलित करना चाहता हूं, लेकिन मुझे यह जानना होगा कि कहां से शुरू करना है।सी # कोड आकार

+2

आप गलत भाषा का उपयोग कर रहे हैं। – ordag

+2

विंडोज एक्सप्लोरर? ;-) – jadarnel27

+1

क्या इस इच्छा के पीछे कोई व्यावहारिक तर्क है, या क्या यह पूरी तरह निष्क्रिय जिज्ञासा है? – LukeH

उत्तर

3

यदि आप रनटाइम पर कक्षा/प्रकार को स्टोर करने के लिए आवश्यक बाइट्स में आकार जानना चाहते हैं।

value typessizeof(type) का उपयोग reference types के लिए, प्रत्येक क्षेत्र/संपत्ति पर sizeof का उपयोग करें।


आप कामयाब DLLs के आकार का पता चाहते हैं, स्पष्ट तरीका dll संकलन और फ़ाइल आकार की जाँच करने के लिए है। इसे प्रोग्रामेटिक रूप से करने के लिए, उपयोगकर्ता 1027167 के उत्तर, और CodeDomProvider कक्षा पर नज़र डालें।

कुछ और जो कोड में सक्षम हो सकता है वह है कि कक्षाओं में प्रत्येक विधि के जेनरेट आईएल के साथ-साथ sizeof फ़ील्ड के माप (शायद केवल सापेक्ष) आकार के रूप में प्राप्त करें।

आप इसके लिए MethodBase.GetMethodBody विधि का उपयोग कर सकते हैं।

एक बार Roslyn (compiler as a service)(preview available) जारी की है तो आप शायद यह और अधिक आसानी से और संभवतः, मिल सकता है सही ढंग से (के रूप में यह सिर्फ तरीकों और क्षेत्रों नहीं है कि एक वर्ग 'आईएल बना है।


आप जानना चाहते हैं डीएलएल बनाने के लिए इस्तेमाल किए गए कोड का आकार, आपको Reflector

+0

मैं प्रबंधित डीएलएल में प्रत्येक वर्ग के कोड का आकार जानना चाहता हूं। –

+0

जब आप कोड का आकार कहते हैं, तो क्या आपका मतलब डीएलएल का आकार है, या डीएलएल का उत्पादन करने के लिए इस्तेमाल किए गए कोड का आकार? –

+0

संकलित कोड का आकार = डीएलएल :) –

1

मानना ​​होगा कि आप अपने संकलित कोड के बाइट्स में आकार जानना चाहते हैं, मुझे लगता है कि आपको इसे संकलित करना है। अगर आप स्वचालित करना चाहते हैं यह, इसे देखें:

ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler()); 
CompilerParameters cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("system.dll"); 
cp.ReferencedAssemblies.Add("system.data.dll"); 
cp.ReferencedAssemblies.Add("system.xml.dll"); 
cp.GenerateExecutable = false; 
cp.GenerateInMemory = true; 
CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString()); 
if (cr.Errors.HasErrors) 
{ 
    StringBuilder error = new StringBuilder(); 
    error.Append("Error Compiling Expression: "); 
    foreach (CompilerError err in cr.Errors) 
    { 
     error.AppendFormat("{0}\n", err.ErrorText); 
    } 
    throw new Exception("Error Compiling Expression: " + error.ToString()); 
} 
Assembly a = cr.CompiledAssembly; 

परिवर्तनीय "कोड" (यहां एक स्ट्रिंगबिल्डर) में आपके वर्ग का मान्य स्रोत-कोड होना चाहिए जिसमें आप मापना चाहते हैं। संकलन के बाद आपको केवल आउटपुट असेंबली के आकार को देखना होगा।

+0

ध्यान दें कि 'CSharpCodeProvider.CreateCompiler' विधि अब अप्रचलित है। आप सीधे 'CSharpCodeProvider' पर' ICodeCompiler' विधियों का उपयोग कर सकते हैं। –

+0

एक समाधान हो सकता है। मुझे कुछ रिफैक्टरिंग करने की ज़रूरत होगी, लेकिन यह काम कर सकती है। –

3

प्रतिबिंब के साथ एमएसआईएल का आकार प्राप्त करने का एक तरीका होगा। एमएसआईएल के आकार को निर्धारित करने के लिए आपको सभी विधियों, संपत्ति सेटर्स और गेटर्स और कन्स्ट्रक्टरों के माध्यम से लूप करना होगा। इसके अलावा, डिबग बनाम रिलीज बिल्ड के आधार पर आकार में भिन्नताएं होंगी।

using System.Reflection; 

int totalSize = 0; 

foreach(var mi in typeof(Example).GetMethods(BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Static | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.SetProperty)) 
{ 
    MethodInfo mi = typeof(Example).GetMethod("MethodBodyExample"); 
    MethodBody mb = mi.GetMethodBody(); 
    totalSize += mb.GetILAsByteArray().Length; 
} 
+0

मैं यह अनुमान लगाने के लिए कि एक विधि की संभावना क्यों दी जाएगी, यह मेरे लिए समाधान था या नहीं, यह एक विधि के एमएसआईएल आकार को कैसे ढूंढें। धन्यवाद! –