2010-01-12 48 views
45

Làm thế nào tôi có thể truy xuất ngày được tạo từ hội đồng .NET hiện tại?Lấy ngày của một hội đồng .NET

Tôi muốn thêm một số chức năng thực sự đơn giản mà ứng dụng của tôi ngừng hoạt động sau một tuần kể từ ngày xây dựng lắp ráp chính. Tôi đã viết mã giết chết ứng dụng của tôi sau một ngày nhất định. Tôi chỉ cần lập trình lấy ngày tạo ra từ hội đồng.

Trả lời

41

Tôi không nghĩ rằng việc lắp ráp tự chứa nó là ngày tạo. Tôi nghi ngờ gần nhất bạn có thể nhận được là ngày tạo của tập tin lắp ráp chính nó:

File.GetCreationTime(Assembly.GetExecutingAssembly().Location) 

nên làm các thủ thuật.

EDIT:

Tôi nghĩ rằng giải pháp Jeff Atwood, được viết lên bởi "lựu đạn" trong chủ đề này, có lẽ là cách tốt hơn để đi ngay bây giờ.

+8

Nó hoạt động trong hầu hết các trường hợp, nhưng nếu một trong những cố gắng sử dụng nó trong giải pháp VSTO (ví dụ Excel add-in), anh ta sẽ luôn nhận được ngày hôm nay bởi vì các tập tin lắp ráp đang được sao chép vào thư mục AppData \ Local \ assembly trước khi chạy thêm -in bên trong Excel. – surfen

+0

Cũng không hoạt động nếu bạn sao chép nó vào mạng tải xuống từ ftp, v.v. –

+1

Thành thật mà nói, tôi nghĩ giải pháp của Jeff Atwood, được viết bằng lựu đạn trong chủ đề này, có lẽ là cách tốt hơn để đi ngay bây giờ. –

4

này nên làm việc:

var entryAssembly = Assembly.GetEntryAssembly(); 
var fileInfo = new FileInfo(entryAssembly.Location); 
var buildDate = fileInfo.LastWriteTime; 
22

Có gì sai với:

System.IO.File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location); 
+0

này là tốt hơn nhiều bởi vì tôi có nhiều DLL đang được cập nhật. Cảm ơn! –

+3

Tốt hơn nhiều. 'GetCreationTime()' trả về thời gian khi assembly được tạo ra FIRST. Điều này không trả về thời gian khi assembly được tạo ra. – Jop

2

Cách tốt nhất để làm điều này sẽ là với thuộc tính tùy chỉnh mà bạn đặt trên PreBuild của hội đồng của bạn.

Và sau đó sử dụng phản ánh tiêu chuẩn để lấy thuộc tính bạn đã tạo.

Nhưng vì tò mò, tại sao lại xóa ứng dụng sau ngày BUILD?

+0

Không cần phải là ngày xây dựng. Tôi chỉ chọn ngày đó vì tôi biết ngày đó sẽ tự động thay đổi khi ứng dụng được tạo. Mục tiêu, tôi chỉ muốn cho phép ứng dụng hoạt động trong khoảng một tuần.Tôi cũng có thể mã hóa một ngày vào mã nhưng sẽ cần phải thay đổi biến đó khi các thay đổi được thực hiện cho ứng dụng. – DenaliHardtail

+0

@Scott nhưng theo cách của bạn để giết ứng dụng, có thể dễ dàng bị phá vỡ. –

+1

Giết ứng dụng dựa trên ngày xây dựng có vẻ giống như một cách hay để giảm tiếng ồn khi thực hiện thử nghiệm alpha trong môi trường không có cấu trúc (ví dụ: tình nguyện viên internet). Bằng cách này, bạn tránh mọi người tải xuống alpha mới nhất, quên nó trong 3 tuần và sau đó kiểm tra và báo cáo rất nhiều lỗi đã được xử lý. Nó đảm bảo rằng người thử nghiệm alpha luôn sử dụng phiên bản ứng dụng gần đây, mà không có thứ gì đó có thể giới thiệu nhiều lỗi hơn ở giai đoạn đó như tính năng tự động cập nhật. – David

9

Có lẽ bài này on coding horror có thể giúp

+0

+1 Điều đó hiệu quả! – devios1

+0

Liên kết này đã chết. –

+0

liên kết được cập nhật, mặc dù một số câu trả lời khác ở đây làm điều tương tự hoặc tham khảo bài viết này vị trí mới – jmlumpkin

56

Sau đây là dựa trên: https://blog.codinghorror.com/determining-build-date-the-hard-way/

public static class ApplicationInformation 
{ 
    /// <summary> 
    /// Gets the executing assembly. 
    /// </summary> 
    /// <value>The executing assembly.</value> 
    public static System.Reflection.Assembly ExecutingAssembly 
    { 
     get { return executingAssembly ?? (executingAssembly = System.Reflection.Assembly.GetExecutingAssembly()); } 
    } 
    private static System.Reflection.Assembly executingAssembly; 

    /// <summary> 
    /// Gets the executing assembly version. 
    /// </summary> 
    /// <value>The executing assembly version.</value> 
    public static System.Version ExecutingAssemblyVersion 
    { 
     get { return executingAssemblyVersion ?? (executingAssemblyVersion = ExecutingAssembly.GetName().Version); } 
    } 
    private static System.Version executingAssemblyVersion; 

    /// <summary> 
    /// Gets the compile date of the currently executing assembly. 
    /// </summary> 
    /// <value>The compile date.</value> 
    public static System.DateTime CompileDate 
    { 
     get 
     { 
      if (!compileDate.HasValue) 
       compileDate = RetrieveLinkerTimestamp(ExecutingAssembly.Location); 
      return compileDate ?? new System.DateTime(); 
     } 
    } 
    private static System.DateTime? compileDate; 

    /// <summary> 
    /// Retrieves the linker timestamp. 
    /// </summary> 
    /// <param name="filePath">The file path.</param> 
    /// <returns></returns> 
    /// <remarks>http://www.codinghorror.com/blog/2005/04/determining-build-date-the-hard-way.html</remarks> 
    private static System.DateTime RetrieveLinkerTimestamp(string filePath) 
    { 
     const int peHeaderOffset = 60; 
     const int linkerTimestampOffset = 8; 
     var b = new byte[2048]; 
     System.IO.FileStream 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(); 
     } 
     var dt = new System.DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(System.BitConverter.ToInt32(b, System.BitConverter.ToInt32(b, peHeaderOffset) + linkerTimestampOffset)); 
     return dt.AddHours(System.TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours); 
    } 
} 
+0

Điều này làm cho một phương pháp mở rộng tốt đẹp trên lớp Assembly. –

+1

Không hoạt động đối với các cụm được tạo thông qua sự phản chiếu (trong bộ nhớ). Những người không có vị trí (chuỗi rỗng). –

+19

Tôi sẽ không mong đợi để tìm một ngày biên dịch trên một bộ nhớ trong bộ nhớ giống như tôi sẽ không mong đợi để tìm sọc ngựa vằn trên một con ngựa. – grenade

1

Nếu bạn đang viết một ứng dụng cho một thiết bị di động sử dụng framwork nhỏ gọn, Assembly.Location không có sẵn .

Here, tôi thấy một sự thay thế:

 System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) 
Các vấn đề liên quan