2009-06-09 11 views
8

मैं एक .NET एप्लिकेशन में वर्तमान समय और दिनांक शामिल करना चाहता हूं ताकि उपयोगकर्ता को यह दिखाने के लिए स्टार्टअप लॉग में शामिल किया जा सके कि उपयोगकर्ता के पास कौन सा संस्करण है। क्या संकलन के दौरान वर्तमान समय को पुनर्प्राप्त करना संभव है, या क्या मुझे निष्पादन योग्य के निर्माण/संशोधन का समय मिलना होगा?मैं .NET/C# अनुप्रयोग में संकलन समय पर वर्तमान समय और दिनांक कैसे पा सकता हूं?

उदा।

एप्लिकेशनएक्स में आपका स्वागत है। यह दिन-महीने-वर्षसमय पर बनाया गया था।

+0

हो सकता है इस संबंधित सवाल आपके लिए एक समाधान है कि: http://stackoverflow.com/questions/878037/msbuild- msbuildcommunitytasks-task-time –

+0

आप [linker timestamp] का उपयोग कर सकते हैं (http://stackoverflow.com/questions/2234969/adding-compilation-date-to-the-code/2235211#2235211) – user423430

उत्तर

8

आप अपने बिल्ड नंबर के लिए प्रतिबिंब का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं कि यह पता लगाने की है जब एक निर्माण संकलित किया गया।एक विधानसभा के लिए

संस्करण जानकारी निम्नलिखित चार मूल्यों के होते हैं:

  1. मेजर संस्करण
  2. माइनर संस्करण
  3. बिल्ड नंबर
  4. संशोधन

आप सभी मान निर्दिष्ट कर सकते या आप एक तारांकन (*) का उपयोग करके डिफ़ॉल्ट बिल्ड नंबर, संशोधन संख्या, या दोनों को स्वीकार कर सकते हैं। बिल्ड नंबर और संशोधन डिफ़ॉल्ट रूप से 1 जनवरी, 2000 को आधारित हैं।

निम्नलिखित विशेषता प्रमुख और मामूली सेट करेगी, लेकिन उसके बाद बिल्ड संख्या और संशोधन में वृद्धि होगी।

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

तो फिर तुम कुछ इस तरह उपयोग कर सकते हैं:

echo char * gBuildSig ="%DATE% %TIME%"; > BuildTimestamp.c 

और फिर जिसके परिणामस्वरूप सी स्रोत:

public static DateTime CompileTime 
{ 
    get 
    { 
     System.Version MyVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 
     // MyVersion.Build = days after 2000-01-01 
     // MyVersion.Revision*2 = seconds after 0-hour (NEVER daylight saving time) 
     DateTime compileTime = new DateTime(2000, 1, 1).AddDays(MyVersion.Build).AddSeconds(MyVersion.Revision * 2);     
     return compileTime; 
    } 
} 
+0

मुझे लगता है कि लौटाई गई तारीख यूटीसी है। – Nick

+0

मैं वर्तमान में इसका उपयोग VS2015 के साथ कर रहा हूं। यह स्थानीय समय पर लौटाता है, लेकिन अगर आप 18:12 (लगभग) के बाद निर्माण उत्पन्न करने की योजना बनाते हैं तो माइनर रीविजन को यूहॉर्ट पर डाला जाना चाहिए। डीएसटी से निपटने के लिए, मैं GetDaylightChanges का उपयोग करूंगा, लेकिन अभी तक इसे आजमाया नहीं है। – jramos

2

ऐसा करने के लिए भाषा में कुछ भी नहीं बनाया गया है।

आप वर्तमान दिनांक और समय को स्रोत फ़ाइल में लिखने के लिए पूर्व-निर्माण चरण लिख सकते हैं, हालांकि (स्ट्रिंग अक्षर में, उदाहरण के लिए, या DateTime उत्पन्न करने के लिए स्रोत कोड के रूप में), और फिर इसे भाग के रूप में संकलित करें आपके निर्माण का।

मैं सुझाव है कि आप संभव के रूप में इस स्रोत फ़ाइल के रूप में सरल है, लेकिन इस जानकारी को कुछ भी नहीं युक्त होगा। वैकल्पिक रूप से यह एक मौजूदा फ़ाइल को संपादित कर सकता है।

इसके उदाहरण के लिए, MiscUtil के लिए बिल्ड फ़ाइल देखें जो वर्तमान SVN संशोधन AssemblyFileVersion विशेषता में एम्बेड करता है। निर्माण फ़ाइल से कुछ मिश्रित बिट्स:

<!-- See http://msbuildtasks.tigris.org --> 
<Import 
Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

<!-- Find out what the latest version is --> 
<SvnInfo RepositoryPath="$(SvnUrl)"> 
    <Output TaskParameter="LastChangedRevision" PropertyName="Revision" /> 
</SvnInfo> 

<!-- Update the AssemblyInfo with the revision number --> 
<FileUpdate Files="$(OutputDirectory)\MiscUtil\MiscUtil\Properties\AssemblyInfo.cs" 
      Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])' 
      ReplacementText='$1.$2.$(Revision)$5' /> 
+0

के बारे में सुझाव के लिए धन्यवाद असेंबली लेकिन यह मेरी जरूरत से थोड़ा अधिक जटिल था। एक स्रोत फ़ाइल में डंपिंग जानकारी बस ठीक है। – Nick

3

एक ही रास्ता मैं यह कर के बारे में पता कुछ हद तक जटिल है -

आप एक पूर्व निर्माण घटना है कि एक छोटे से आवेदन है जिस पर स्रोत कोड उत्पन्न करता है चलाता है हो सकता है मक्खी। ऐसा करने का एक आसान तरीका सिर्फ एक बहुत ही छोटी फ़ाइल को ओवरराइट करना है जिसमें एक वर्ग (या आंशिक वर्ग) शामिल है जिसमें दिन/महीना/वर्ष स्ट्रिंग स्थिर के रूप में हार्डकोड किया गया हो।

आप इस एक पूर्व निर्माण घटना के रूप में चलाने के लिए सेट करते हैं, तो यह हर निर्माण से पहले उस फ़ाइल को फिर से लिखने होंगे।

+0

धन्यवाद, यही वह है जो मैंने किया।मैंने थोड़ा सी # ऐप लिखा था जिसे प्री-बिल्ड चरण के रूप में चलाया जा सकता है। – Nick

2

आप पोस्टशर्प का उपयोग तुरंत पोस्ट-बिल्ड की तारीख में बुनाई के लिए कर सकते हैं। PostSharp एक हल्के पहलू उन्मुख प्रोग्रामिंग लाइब्रेरी के साथ आता है, लेकिन इसे विभिन्न तरीकों से आपको जो भी चाहिए, उसमें बुनाई के लिए बढ़ाया जा सकता है। यह आईएल स्तर पर काम करता है, लेकिन एपीआई आपको इससे थोड़ा सा सारणी देता है।

http://www.postsharp.org/

0

आप अपने निर्माण के हिस्से के रूप AssemblyInfo.cs में विधानसभा संस्करण को अद्यतन कर सकते हैं। तो फिर तुम इस

FileVersionInfo lvar = FileVersionInfo.GetVersionInfo(FileName); 

FileVersionInfo जानकारी (/ संस्करण, आदि का निर्माण) जिसे आप खोज है की तरह कुछ कर सकता है। देखें कि यह आपके लिए काम करता है या नहीं।

+0

यह ऐप के बारे में कुछ चीजों की रिपोर्ट करने के लिए काम कर सकता है, लेकिन ओपी ने पूछा कि कैसे तिथि और समय बनाना है। – JeffH

2

सी कार्यक्रमों के लिए makefiles में, यह कुछ इस तरह देखने के लिए आम बात है फ़ाइल छवि में संकलित है। विंडोज़ पर उपरोक्त काम करता है क्योंकि% date% और% time% चर cmd.exe में ज्ञात हैं, लेकिन इसी तरह की चीज बिल्ली का उपयोग कर यूनिक्स पर काम करेगी।

आप सी # का उपयोग कर वही काम कर सकते हैं। एक बार फिर, यह एक ऐसा तरीका है जब आप मेकफ़ाइल का उपयोग कर रहे हों। आपको एक कक्षा, और एक सार्वजनिक स्थैतिक संपत्ति की आवश्यकता है।

BuildTimestamp.cs: 
    echo public static class Build { public static string Timestamp = "%DATE% %TIME%";} > BuildTimestamp.cs 

और फिर बात आप निर्माण कर रहे हैं, निर्भरता और एक हटाने के लिए:

MyApp.exe: BuildTimestamp.cs MyApp.cs 
    $(_CSC) /target:exe /debug+ /optimize- /r:System.dll /out:MyApp.exe MyApp.cs BuildTimestamp.cs 
    -del BuildTimestamp.cs 

आप इसे संकलन के बाद BuildTimestamp.cs फ़ाइल को नष्ट करना सुनिश्चित करें; आप इसका पुन: उपयोग नहीं करना चाहते हैं। फिर, अपने ऐप में, बस Build.Timestamp का संदर्भ लें।

एमएसबिल्ड या विजुअल स्टूडियो का उपयोग करके, यह अधिक जटिल है। मुझे हल करने के लिए% date% या% time% नहीं मिला। उन चीजें छद्म पर्यावरण चर हैं, मुझे लगता है कि यही कारण है। तो मैंने AlwaysCreate = true के साथ टच कार्य का उपयोग करके टाइमस्टैम्प प्राप्त करने के लिए अप्रत्यक्ष तरीके का सहारा लिया। यह एक खाली फाइल बनाता है। अगला चरण फ़ाइल के टाइमस्टैम्प का संदर्भ देने, उसी फ़ाइल में स्रोत कोड लिखता है। एक मोड़ - मुझे अर्धविराम से बचना पड़ा।

आपके पूर्व-निर्माण चरण को "BuildTimestamp" लक्ष्य बनाना चाहिए। और उस फ़ाइल को संकलन में शामिल करना सुनिश्चित करें। और पोस्ट-बिल्ड चरण में बाद में इसे हटा दें।

<ItemGroup> 
    <StampFile Include="BuildTimestamp.cs"/> 
</ItemGroup> 

<Target Name="BuildTimestamp" 
     Outputs="@(StampFile)"> 
    <Message Text="Building timestamp..." /> 

    <Touch 
     AlwaysCreate="true" 
     Files="@(StampFile)" /> 

    <WriteLinesToFile 
     File="@(StampFile)" 
     Lines='public static class Build { public static string Timestamp = "%(StampFile.CreatedTime)" %3B }' 
     Overwrite="true" /> 

</Target> 
0

हाय मैं उसी के लिए विधि निम्नलिखित इस्तेमाल किया ...

private DateTime ExecutableInfo() 
{ 
    System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath.Trim()); 
    try 
    { 
    return fi.CreationTime; 
    } 
    catch (Exception ex) 
    { 
    throw ex; 
    } 
    finally 
    { 
    fi = null; 
    } 
} 
संबंधित मुद्दे