2009-01-07 5 views
6

सी # 3.0 में, मैं एक संपत्ति जो वर्ग के संस्करण को शामिल करने के लिए लगता है की है। संस्करण संख्या बस संकलन की तारीख और समय है।मैं सी # में Precompiler से वर्तमान दिनांक समय कैसे मिल सकता है?

public DateTime Version 
{ 
    get { return DateTime.UtcNow; } 
} 

जाहिर है, यह गलत है के बाद से इस संपत्ति मुझे वर्तमान दिनांक और समय देता है: अभी, मैं निम्नलिखित कोड है। तो, precompiler है कर सकते हैं प्रिंट संकलन समय पर दिनांक समय? इस मामले में, मैं नीचे जैसा कुछ कर सकता था।

public DateTime Version 
{ 
    get { return new DateTime("PRECOMPILER DATE"); } 
} 

उत्तर

7

सी # में मैक्रोज़ की अवधारणा नहीं है; हालांकि, आप संकलित करने से पहले स्रोत को कुशल बनाने के लिए अपनी बिल्ड स्क्रिप्ट (csproj/NANT/etc) में अन्य टूल का उपयोग कर सकते हैं। मैं इसका उपयोग करता हूं, उदाहरण के लिए, वर्तमान एसवीएन संशोधन में संशोधन संख्या सेट करने के लिए।

एक सस्ता विकल्प एक पूर्व निर्माण घटना (आप वी.एस. संवाद परियोजना गुण के माध्यम से यह कर सकते हैं) है: अनिवार्य रूप से एक बल्ला फ़ाइल है कि निर्माण से पहले चलाता है; फिर आप जो भी बदलाव चाहते हैं उसे स्क्रिप्ट कर सकते हैं। एक और परिष्कृत विकल्प निर्माण कार्य है।

उदाहरण के लिए, उपयोगिता लाइब्रेरी here में Time कार्य और FileUpdate कार्य शामिल है; आपको (सिद्धांत में) दोनों को एक साथ जोड़ना संभव है जो आपको चाहिए।

व्यक्तिगत रूप से, मैं समय के बजाय [AssemblyVersion] विवरण का उपयोग करता हूं - यदि आप इसे अपने स्रोत-नियंत्रण प्रणाली से लिंक करते हैं, तो यह अपमानजनक संस्करण को ढूंढना बहुत आसान बनाता है; तो मेरे SVN संस्करण के लिए, मैं तो (अपने निर्माण proj में) का उपयोग करें:

<!-- See http://msbuildtasks.tigris.org --> 
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 
... 
<SvnInfo LocalPath="."> 
    <Output TaskParameter="Revision" PropertyName="BuildRev" /> 
</SvnInfo> 
... 
<FileUpdate Files="Path\To\My\AssemblyInfo.cs" 
    Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])' 
    ReplacementText='$1.$2.$(BuildRev)$5' /> 
<FileUpdate Files="Path\To\My\AssemblyInfo.cs" 
    Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])' 
    ReplacementText='$1.$2.$(BuildRev)$5' /> 

और अब मेरी विधानसभा संस्करण सही है, तो फ़ाइल संस्करण है कि ओएस द्वारा रिपोर्ट हो जाता है भी शामिल है।

+0

मैं कुछ करने के समान में यह करने के लिए एमएसबिल्ड माइक्रोसॉफ्ट एसडीसी कार्यों का उपयोग कर: http://www.codeplex.com/sdctasks –

3

सी # में __TIME__ प्रीप्रोसेसर निर्देश के लिए कोई समकक्ष नहीं है, सबसे अच्छा आप वर्तमान असेंबली प्राप्त कर सकते हैं और बनाई गई तारीख प्राप्त कर सकते हैं, इसमें संकलन समय होगा। देखें here

0

मुझे नहीं लगता कि सी # - सी ++ शैली मैक्रो परिभाषाओं में ऐसा करने का कोई तरीका है जो अनजाने में अस्वीकृत है।

आप असेंबली की अंतिम संशोधित तिथि का उपयोग करके इसके आसपास काम कर सकते हैं, या संभावित रूप से एक एम्बेडेड संसाधन के रूप में एक टेक्स्ट फ़ाइल शामिल कर सकते हैं और एक कस्टम बिल्ड एक्शन जोड़ सकते हैं जो वर्तमान दिनांक/समय को लिखता है।

0

कोई पूर्वप्रक्रमक __TIME__ निर्देश नहीं है, लेकिन इस तरह विधानसभा के निर्माण के समय के रूप में अन्य बातों के आप इस्तेमाल कर सकते हैं, है। आप अपने स्रोत नियंत्रण प्रणाली (विवर्तन में $ $ $) से कीवर्ड प्रतिस्थापन का उपयोग करने पर भी विचार कर सकते हैं।

8

आप dll ही (Source: codinghorror)

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; 
    } 
+0

दिलचस्प लिंक ... धन्यवाद। –

+0

आपका स्वागत है :) – Stormenet

+1

यह भी अच्छा है कि यह मोनोटच पर भी काम करता है। –

-1

Build संख्या एक विधानसभा का मेटाडाटा से प्राप्त किए जा सकें से नहीं निकाला जा सकता है, और निर्माण की तारीख के साथ मैच के लिए सेट किया जा सकता।

आम तौर पर आप पाते हैं, या AssemblyInfo.cs फ़ाइल में एक प्रविष्टि पैदा करेगा। जब आपका प्रोजेक्ट विजुअल स्टूडियो का उपयोग करके बनाया जाता है।एक उदाहरण:

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

AssemblyVersionAttribute पर प्रलेखन के लिए एक उद्धरण। (मैं कुछ महत्वपूर्ण भागों बोल्ड कर दिया है)

आप सभी मान निर्दिष्ट कर सकते हैं या आप एक तारांकित () का उपयोग करके डिफ़ॉल्ट बिल्ड नंबर, संशोधन संख्या, या दोनों को स्वीकार कर सकते हैं। उदाहरण के लिए, [असेंबली: असेंबली वर्जन ("2.3.25.1")] 2 बड़े संस्करण के रूप में 2 को इंगित करता है,मामूली संस्करण, 25 संख्या के रूप में, और 1 संशोधन संख्या के रूप में। एक संस्करण संख्या जैसे [विधानसभा: AssemblyVersion ("। 1.2")] मुख्य संस्करण, 2 के रूप में मामूली संस्करण के रूप में निर्दिष्ट करता है 1, और डिफ़ॉल्ट निर्माण और संशोधन संख्या स्वीकार करता है। एक संस्करण संख्या जैसे [विधानसभा: AssemblyVersion ("1.2.15 *।")] , मुख्य संस्करण के रूप में निर्दिष्ट करता है 1 2 के रूप में निर्माण संख्या के रूप में लघु संस्करण, 15, और डिफ़ॉल्ट संशोधन को स्वीकार करता है नंबर। डिफ़ॉल्ट बिल्ड दैनिक वृद्धि संख्या। डिफ़ॉल्ट संशोधन संख्या यादृच्छिक है।

जैसा कि आप देख सकते हैं, यदि आप इसके साथ डिफ़ॉल्ट बिल्ड नंबर सेट कर सकते हैं। डिफ़ॉल्ट बिल्ड नंबर एक मान है जो हर दिन बढ़ता है।

फिर आप AssemblyName.Version संपत्ति का उपयोग करके बिल्ड नंबर पुनर्प्राप्त कर सकते हैं। एमएसडीएन द्वारा प्रदान किए गए उदाहरण आपको जाने चाहिए।

डिफ़ॉल्ट बिल्ड संख्या 1/1/2000 से दिनों की संख्या है।

This question भी इसका उपयोग कैसे करें इस पर एक स्पष्ट स्पष्टीकरण है।

+0

यह सच नहीं है, बिल्ड नंबर कुछ भी हो सकता है जो आप चाहते हैं और वास्तव में रिलीज करते समय शायद बदल जाएगा। संकलन कब हुआ, यह जानने के लिए आप अपने बिल्ड नंबर पर भरोसा नहीं कर सकते। –

+0

हां, बिल्ड नंबर आप जो कुछ भी चाहते हैं, हो सकता है, लेकिन डिफॉल्ट बिल्ड नंबर, जो संस्करण में "*" का उपयोग करके जेनरेट किया गया है वह 1/1/2000 – GvS

+0

से दिनों की संख्या है, मैंने अपना उत्तर और अधिक बनाया है स्पष्ट। मुझे आशा है कि अब उपयोगकर्ता सेट बिल्ड नंबर और जेनरेट किए गए डिफ़ॉल्ट बिल्ड नंबर के बीच कोई भ्रम नहीं है। – GvS

-1

आप कुछ इस तरह की तलाश में कार्य करें:
(प्राप्त संस्करण-जानकारी के माध्यम से विधानसभा भवन की तिथि है, बिल्ड-संख्या 2000/01/01 के बाद से दिन है)

  var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 
     DateTime versionsDatum = new DateTime(2000, 1, 1); 
     versionsDatum = versionsDatum.AddDays(version.Build); 
संबंधित मुद्दे