2009-12-14 10 views
9

Başlığın tamamen açıklayıcı olduğunu umarım.Tasarım süresine otomatik olarak ekleme tarihini nasıl ekleyebilirim?

C# ile yazılmış bir winform uygulaması var .net 2.0 ile. Son derleme tarihinin otomatik olarak bir kutuya ve ilk sıçrama kutusuna kullanılmak üzere bir değişkene güncellenmesini istiyorum. Şu anda el ile güncelleyen bir dize değişkeni var. Bunu yapmanın bir yolu var mı?

VS2008 2.0 C#

cevap

5

Başka bir numara (kullanamayacağınız), .NET tarafından oluşturulan otomatik oluşturma ve düzeltme sayılarından yararlanmaktır. AssemblyInfo'nız aşağıdaki gibi:

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

Son iki sayı bir tarih/zaman damgasıdır. Bazı kodu (aşağıda listesi) yardımcı olabilir:

Version v = Assembly.GetExecutingAssembly().GetName().Version; 
DateTime compileDate = new DateTime((v.Build - 1) * TimeSpan.TicksPerDay + v.Revision * TimeSpan.TicksPerSecond * 2).AddYears(1999); 

Düzenleme: https://stackoverflow.com/a/804895/2258

+1

Dikkat! Bu kod, 11 Mart 2012'de (artık yıldan beri) bir şey oluşturduğunuzda işe yaramıyor: 11 Mart yerine 12 Mart dönüyor. – JYL

0

hiçbir dahili makro veya bunun için benzer vardır .net. En iyi bahsiniz Time görevini ve RegexReplace veya benzeri kullanarak tigris gibi özel bir oluşturma görevi olabilir. Doğru olması kolay değil. Şahsen ben AssemblyInfo güncellemek için depo sürümünü kullanmak - geniş ilgili?

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 
... 
<SvnInfo LocalPath="."> 
    <Output TaskParameter="Revision" PropertyName="BuildRev" /> 
</SvnInfo> 
<FileUpdate Files="protobuf-net\Properties\AssemblyInfo.cs" 
     Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])' 
     ReplacementText='$1.$2.$(BuildRev)$5' /> 
+0

Yalnızca bu yaklaşıma katılmıyorum çünkü derlemenin kaynak dosyaları değiştirmemesi gerektiğine inanıyorum. – MarkPflug

1

ben codeproject.com dan this about box kullandı: Burada ben koymak olandan takip etmek biraz daha net olabilir alternatif bir yanıt. Aslında, 2004 yılında Jeff Atwood tarafından yazılmıştı. Derleme süresinin montaj dosyasındaki tarih damgasına bakarak veya derleme versiyonundan hesaplanarak derlenmesi. Belki de ilgili kodu buradan çıkartabilirsiniz.

2

Bunu önceden oluşturduğunuz etkinliklere aktarın;

echo public static class DateStamp { public readonly static System.DateTime BuildTime = System.DateTime.Parse("%date%"); } > $(ProjectDir)DateStamp.cs 

Böyle DateStamp adlı bir sınıf oluşturur;

public static class DateStamp 
{ 
    public readonly static System.DateTime BuildTime = System.DateTime.Parse("14/12/2009"); 
} 

Ve bunu böyle kullanırsınız;

+0

Oluşturmadan önce "DateStamp" tanımak için nasıl alabilirim? Hatayı alıyorum ... 'DateStamp' adı geçerli bağlamda mevcut değil – Brad

+0

Ah, sağ. Dosya (DateStamp.cs) projenizin kök klasöründe olacaktır. VS'de, çözüm gezginine gidin ve şu anda projenizde olmayanlar da dahil olmak üzere tüm dosyaları gösteren düğmeye tıklayın. DateStamp.cs dosyasını bulun, sağ tıklayın ve 'projeye dahil et' seçeneğini seçin. Artık projenizin bir parçası olarak inşa etmelisiniz. –

1

Bu, yararlı olabilmesi için geç bir on yıl olabilir, ancak belki başka birine yardımcı olur.

Sen csproj dosyasına bu hedefi ekleyebilir

, sadece sonunda halde yapıştırarak:

<Target Name="BuildDate" BeforeTargets="CoreCompile"> 
    <PropertyGroup> 
     <SharedAssemblyInfoFile>$(IntermediateOutputPath)CustomAssemblyInfo.cs</SharedAssemblyInfoFile> 
    </PropertyGroup> 
    <ItemGroup> 
     <Compile Include="$(SharedAssemblyInfoFile)" /> 
    </ItemGroup> 
    <ItemGroup> 
     <AssemblyAttributes Include="AssemblyMetadata"> 
     <_Parameter1>AssemblyDate</_Parameter1> 
     <_Parameter2>$([System.DateTime]::UtcNow.ToString("u"))</_Parameter2> 
     </AssemblyAttributes> 
    </ItemGroup> 
    <WriteCodeFragment Language="C#" OutputFile="$(SharedAssemblyInfoFile)" AssemblyAttributes="@(AssemblyAttributes)" /> 
    </Target> 

Bu tek bir satır içeren "obj" klasöründe bir CustomAssemblyInfo.cs dosyası oluşturacak: [assembly: AssemblyMetadata("AssemblyDate", "DATE_OF_BUILD_HERE")] Bu dosya montaj derlenmiş olacak, bu yüzden böyle aşağıdaki kodla gibi yansıma kullanarak çalışma zamanında erişebilir:

using System; 
using System.Linq; 
using System.Reflection; 

public class Application 
{ 
    static DateTime BuildDate; 
    public static DateTime GetBuildDate() 
    { 
     if (BuildDate == default(DateTime)) { 
      var attr = typeof(Application).Assembly.GetCustomAttributes<AssemblyMetadataAttribute>(); 
      var dateStr = attr.Single(a => a.Key == "AssemblyDate")?.Value; 
      BuildDate = DateTime.Parse(dateStr); 
     } 
     return BuildDate; 
    } 
} 

Unutulmaması gereken bir şey, ben burada kullanıyorum sadece oldu AssemblyMetadataAttribute eklendi .NET 4.5.3, bu nedenle önceki bir sürümü desteklemeniz gerekiyorsa, tarih değerini tutmak için kendi özel öznitelik türünüzü tanımlayabilirsiniz.

İlgili konular