2010-04-06 8 views
6

मैं अपने .NET-अनुप्रयोग उपयोगों के सभी DLL के संस्करणों को लॉग करना चाहता हूं। इससे कोई फर्क नहीं पड़ता कि लॉग-आउटपुट स्टार्टअप पर या प्रत्येक डीएलएल के पहले उपयोग पर उत्पन्न होता है।सभी प्रयुक्त DLLs के लॉग संस्करण

पहला समाधान जो मेरे दिमाग में आया था, वह सभी डीएलएल फाइलों पर फिर से चलाना था जो मेरी असेंबली के समान निर्देशिका में रहते थे। लेकिन क्या यह मेरे पास सबसे अच्छा विकल्प है? क्या ऐसा करने का कोई बेहतर तरीका है? यह महत्वपूर्ण है कि समाधान .NET-Compact-Framework पर भी काम करना चाहिए।

+1

इस प्रश्न के उत्तर के अनुसार यह एक साधारण समाधान मौजूद नहीं है, http://stackoverflow.com/questions/940885 –

उत्तर

6

संपादित करें: मैंने परीक्षण किया और सत्यापित किया कि यह .NET कॉम्पैक्ट फ्रेमवर्क पर काम करता है।

आप Mono.Cecil का उपयोग करके ऐसा कर सकते हैं, एक शक्तिशाली उपकरण जो आपको आईएल स्तर पर .NET असेंबली खोलने और निरीक्षण करने की अनुमति देता है, बिना उन्हें ऐपडोमेन में लोड किए।

string path = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; 

// If using Mono.Cecil 0.6.9.0: 
AssemblyDefinition myAssembly = AssemblyFactory.GetAssembly(path); 

// If using Mono.Cecil 0.9.1.0: 
AssemblyDefinition myAssembly = AssemblyDefinition.ReadAssembly(path); 

// from there, you can inspect the assembly's references 
foreach (ModuleDefinition module in myAssembly.Modules) 
{ 
    foreach (AssemblyNameReference assemblyReference in module.AssemblyReferences) 
    { 
     // do something with the reference e.g get name, version, etc 
     string fullName = assemblyReference.FullName; 
     Version version = assemblyReference.Version; 
    } 
} 
+0

यह कॉम्पैक्ट फ्रेमवर्क के लिए भी दूरस्थ रूप से सहायक कैसे है? – ctacke

+1

@ctacke: Mono.Cecil एक मोनो विशिष्ट पुस्तकालय नहीं है; आप इसे अपने आवेदन के साथ तैनात करते हैं। मैंने सत्यापित किया है कि यह वास्तव में सीएफ पर काम करता है। –

+0

तो वह बस ठंडा हो रहा है! – ctacke

0

मुझे यकीन नहीं है कि यह सीएफ पर उपलब्ध है, लेकिन सामान्य .NET में, मैं बस AppDomain.GetAssemblies() का उपयोग करता हूं।

आप असेंबली लोड होने पर आपको सूचित करने के लिए AppDomain.AssemblyLoad ईवेंट का उपयोग कर सकते हैं।

+1

दुर्भाग्यवश दोनों विधि और घटना सीएफ पर उपलब्ध नहीं है। – Bob

0

आप Dependency Walker का उपयोग करने में सक्षम हो सकते हैं, और केवल उप-प्रोसेस के रूप में इसे निष्पादित करने के लिए कमांड लाइन विकल्पों का उपयोग कर सकते हैं। एफएक्यू के मुताबिक, यह विंडोज सीई मॉड्यूल के खिलाफ काम करता है, हालांकि यह सीई उपकरणों पर नहीं चलता है, ताकि आपकी आवश्यकताओं के अनुरूप न हो।

0

AppDomain.Assembly लोड ईवेंट का उपयोग करें।

उदा।

AppDomain.CurrentDomain.AssemblyLoad+=(s, e) => 
    Console.WriteLine("loaded: "+e.LoadedAssembly.FullName); 
+1

दुर्भाग्य से असेंबली लोड-इवेंट कॉम्पैक्ट फ्रेमवर्क पर उपलब्ध नहीं है। – Bob

0
public void LogAssemblies() 
{ 
    foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
    AssemblyName assemblyName = asm.GetName(); 
    string simpleName = assemblyName.Name; 
    string version = assemblyName.Version.ToString(); 
    // do something with these 
    } 
} 

संपादित करें: ओह, AppDomain.GetAssemblies तरह लग रहा है() कॉम्पैक्ट ढांचे में नहीं है।

0

मुझे लगता है कि एक दिलचस्प एल्गोरिथ्म विधानसभाओं का उपयोग कर रहे है, तो, स्टार्टअप पर क्रमानुसार करने होगा, आप अपने विन्यास deserialize और कौन-सा संस्करण आप प्रत्येक DLL की राशि के साथ तुलना करें। फिर, संस्करण अद्यतन पर, आप अपनी कॉन्फ़िगरेशन का एक नया संस्करण क्रमबद्ध करते हैं और अपने असेंबली नाम और संस्करण को अपने लॉगफाइल में लॉग करते हैं या फिर।

ध्यान रखें कि विचार करने की सबसे महत्वपूर्ण बात यह है कि आपको वह करने की ज़रूरत है जो आपको करने की ज़रूरत है। और कुछ मायने नहीं रखता है। एक बार यह आपके लिए आवश्यक नौकरी करता है, तो शायद सुधार के लिए जगह है। लेकिन सबसे पहले, यह काम कर लो! आप बस देखेंगे कि बाद में क्या सुधार किया जाना चाहिए।

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