2009-04-29 10 views
28

मैं एक असेंबली की अंतिम संशोधित तारीख को प्रस्तुत करना चाहता हूं (आंतरिक डिबगिंग/जानकारी के लिए), इसलिए मुझे पता चलेगा कि एक निश्चित वेबसाइट तैनात की गई थी।मैं पिछली संशोधित तारीख को असेंबली कैसे प्राप्त कर सकता हूं?

क्या यह प्रतिबिंब के माध्यम से प्राप्त करना संभव है?

मैं इस तरह संस्करण प्राप्त:

Assembly.GetExecutingAssembly().GetName().Version.ToString(); 

मैं कुछ इसी तरह की तलाश में हूँ - कि जैसे मैं, भौतिक फ़ाइल को खोलने के उसके गुण प्राप्त करने के लिए नहीं करना चाहते, या कुछ और, के रूप में मैं इसे मास्टर पेज में प्रस्तुत किया जाएगा, और उस तरह के ओवरहेड नहीं चाहते हैं।

उत्तर

42

मैं दूसरे pYrania का जवाब देंगे:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location); 
DateTime lastModified = fileInfo.LastWriteTime; 

लेकिन इस जोड़ें:

आप उल्लेख आप फाइल सिस्टम का उपयोग नहीं करना चाहते हैं, क्योंकि यह आपके मास्टर पृष्ठ में है और आप डॉन प्रत्येक पृष्ठ के लिए उस अतिरिक्त फ़ाइल सिस्टम को हिट नहीं करना चाहता। इसलिए, एप्लिकेशन लोड ईवेंट में इसे एक बार एक्सेस न करें और फिर इसे एप्लिकेशन-स्तरीय चर के रूप में स्टोर करें।

+0

हाय, मैं इस कोड के साथ करने की कोशिश की, लेकिन मैं अशक्त आ रहा है मेरे मामले स्थान location.in की त्रुटि हो रही है ... इसलिए, मैं क्या करना है ? –

2

मुझे विश्वास नहीं है कि असेंबली में अंतिम संशोधित जानकारी है क्योंकि यह एक ऑपरेटिंग सिस्टम विशेषता है। मुझे विश्वास है कि यह जानकारी प्राप्त करने का एकमात्र तरीका फ़ाइल हैंडल के माध्यम से है।

11

इस बारे में कैसे?

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location); 
DateTime lastModified = fileInfo.LastWriteTime; 
13

आप संशोधन लागू हो और AssemblyInfo में नंबर बिल्ड हैं:

Version version = typeof(MyType).Assembly.GetName().Version; 
DateTime date = new DateTime(2000, 1, 1) 
    .AddDays(version.Build) 
    .AddSeconds(version.Revision * 2); 
+0

हॉलग्रीम का जवाब अच्छी तरह से काम करता है।बस सुनिश्चित करें कि आप असेंबली संस्करण को संशोधित करते हैं, न कि फ़ाइल संस्करण (* ओओपीएस *) –

+0

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

4

कुछ लोगों को लगता है कि विधानसभा की तारीख का निर्माण धारण नहीं करता है:

[assembly: AssemblyVersion("1.0.*")] 

आप के साथ एक अनुमानित निर्माण तिथि प्राप्त कर सकते हैं लेकिन आप जानते हैं कि वे क्या गलत हैं, आप PE header से निष्पादन योग्य फ़ाइल में एम्बेड किए गए लिंकर टाइमस्टैम्प को पुनर्प्राप्त कर सकते हैं, जैसे कि निम्न कार्य कर सकता है (मैंने स्वयं कोड का परीक्षण नहीं किया है)

private DateTime RetrieveLinkerTimestamp() 
{ 
    string filePath = System.Reflection.Assembly.GetCallingAssembly().Location; 
    const int c_PeHeaderOffset = 60; 
    const int c_LinkerTimestampOffset = 8; 
    byte[] b = new byte[2048]; 
    System.IO.Stream s = null; 

    try 
    { 
     s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
     s.Read(b, 0, 2048); 
    } 
    finally 
    { 
     if (s != null) 
     { 
      s.Close(); 
     } 
    } 

    int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset); 
    int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset); 
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0); 
    dt = dt.AddSeconds(secondsSince1970); 
    dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours); 
    return dt; 
} 

या यदि विधानसभा आपके के लिए अपने बेहतर आप निम्नलिखित का उपयोग दृष्टिकोण सरल और आसान है

नीचे करने के लिए पूर्व निर्माण घटना कमांड लाइन जोड़ें:

echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt" 

संसाधन के रूप में इस फाइल को जोड़ें, अब आपके पास अपने संसाधनों में 'BuildDate' स्ट्रिंग।

मैं से this question

+0

उत्तर [.NET असेंबली की तारीख प्राप्त करना] (// stackoverflow.com/q/2050396) के लिए एक सहायक वर्ग है –

0

RetrieveLinkerTimestamp समाधान दोनों जवाब ले लिया है 1970 से int32 का उपयोग करने के वर्ष के बाद काम नहीं करेगा 2038 देय राशि। मैं निम्नलिखित (हालांकि यह शायद बहुत की अपनी सीमाएं हैं) का उपयोग कर सुझाव देते हैं:

IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location) 

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

  • कोई संबंधित समस्या नहीं^_^