2009-12-14 26 views
9

Hy vọng đầy đủ tiêu đề có phần mô tả.Làm cách nào để tự động có ngày xây dựng được chèn vào lúc thiết kế

Tôi có một ứng dụng winform được viết bằng C# với .net 2.0. Tôi muốn có ngày biên dịch cuối cùng được tự động cập nhật thành một biến để sử dụng trong hộp giới thiệu và hộp giật gân ban đầu. Hiện tại tôi có một biến chuỗi mà tôi cập nhật theo cách thủ công. Có cách nào để làm điều này không?

VS2008 .net 2.0 C#

Trả lời

5

Bí quyết khác (bạn không thể sử dụng) là tận dụng các số bản dựng và sửa đổi tự động do .NET tạo. Nếu AssemblyInfo của bạn có:

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

Hai số cuối cùng chỉ là dấu ngày/giờ. Một số mã (danh sách dưới đây) có thể giúp:

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

Edit: đây là một câu trả lời khác có thể một chút rõ ràng hơn để làm theo hơn những gì tôi đặt: https://stackoverflow.com/a/804895/2258

+1

Hãy coi chừng! Mã này không hoạt động khi bạn xây dựng một cái gì đó vào ngày 11 tháng 3 năm 2012 (vì năm nhuận?): Nó sẽ trở lại ngày 12 tháng 3 thay vì ngày 11 tháng 3 – JYL

0

Không có sẵn vĩ mô hoặc tương tự cho việc này. Đặt cược tốt nhất của bạn có thể là tác vụ tùy chỉnh, chẳng hạn như trên tigris, sử dụng tác vụ TimeRegexReplace hoặc tương tự. Không đơn giản để có được quyền. Cá nhân tôi sử dụng phiên bản kho lưu trữ để cập nhật AssemblyInfo - liên quan rộng rãi?

<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

Tôi không đồng ý với cách tiếp cận này chỉ vì tôi tin rằng bản dựng không được biến đổi các tệp nguồn. – MarkPflug

1

tôi đã sử dụng this about box từ codeproject.com. Nó thực sự được viết bởi Jeff Atwood cách trở lại vào năm 2004. Nó tìm ra thời gian biên dịch bằng cách nhìn vào dấu ngày tháng trên tập tin lắp ráp, hoặc tính toán nó từ phiên bản lắp ráp. Có lẽ bạn có thể trích xuất mã có liên quan từ đó.

2

Hãy bật tính năng này vào các sự kiện được tạo trước của bạn;

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

Tạo lớp có tên DateStamp như thế này;

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

Và bạn sử dụng nó như thế này;

Console.WriteLine("Build on " + DateStamp.BuildTime.ToShortDateString()); 
+0

làm cách nào để nó nhận ra "DateStamp" trước khi xây dựng? Tôi gặp lỗi ... Tên 'DateStamp' không tồn tại trong ngữ cảnh hiện tại – Brad

+0

Ah, phải. Tệp (DateStamp.cs) sẽ nằm trong thư mục gốc của dự án của bạn. Trong VS, đi đến trình thám hiểm giải pháp và nhấp vào nút hiển thị tất cả các tệp, bao gồm cả các tệp hiện không có trong dự án của bạn. Tìm DateStamp.cs, nhấp chuột phải vào nó và chọn 'include in project'. Bây giờ bạn sẽ tìm thấy nó được xây dựng như là một phần của dự án của bạn. –

1

Đây có thể là một thập kỷ quá muộn để hữu ích, nhưng có thể nó sẽ giúp người khác.

Bạn có thể thêm mục tiêu này đến file csproj của bạn, chỉ cần dán nó vào ở cuối:

<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> 

Điều này sẽ tạo ra một file CustomAssemblyInfo.cs trong thư mục của bạn "obj", có chứa một dòng duy nhất: [assembly: AssemblyMetadata("AssemblyDate", "DATE_OF_BUILD_HERE")] tập tin này sẽ được biên dịch vào lắp ráp của bạn, vì vậy bạn có thể truy cập vào nó khi chạy sử dụng phản ánh, chẳng hạn như với đoạn mã sau:

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

Một điều cần lưu ý, AssemblyMetadataAttribute mà tôi đang sử dụng ở đây là chỉ được thêm vào .NET 4.5.3, vì vậy nếu bạn cần hỗ trợ phiên bản trước đó, bạn có thể chỉ cần xác định loại thuộc tính tùy chỉnh của riêng mình để giữ giá trị ngày tháng.

Các vấn đề liên quan