2013-09-30 23 views
3

我正在尋找在我的DLL中包含一個函數,該函數給出構建時間或自動構建編號。雖然有大量的C#示例,但我還沒有看到任何F#。如果可能的話,我希望沒有外部包或C#圖層。在F中構建數字#

回答

2

最後修改

下面將告訴你函數所在的裝配的最後修改時間

let lastModified() = 
    System.Reflection.Assembly.GetExecutingAssembly().Location 
    |> System.IO.File.GetLastWriteTime 

版本

要獲取版本號,你首先必須將它添加到F#程序中(它不在默認模板中)。將其添加到項目中的F#源文件(例如Assemblyinfo.fs)

module AssemblyInfo 
open System.Reflection 
[<assembly: AssemblyVersion("1.0.*")>] 
() 

但是請注意,版本1.0。*在C#(2010)中不起作用,它只會自動遞增次要版本而不是修訂版本。 1.0.0。*增加了修訂版本,但不是次要版本。

然後你可以如下閱讀組裝版本:

let version() = 
    System.Reflection.Assembly 
     .GetExecutingAssembly() 
     .GetName() 
     .Version 
2

在這裏,你去。我移植了代碼here

module MyModule 

type BuildTime = 
    static member RetrieveLinkerTimestamp() = 
     let c_PeHeaderOffset = 60 
     let c_LinkerTimestampOffset = 8 
     let filePath = System.Reflection.Assembly.GetCallingAssembly().Location 
     let b : byte array = Array.zeroCreate 2048 
     use s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read) 
     s.Read(b, 0, 2048) |> ignore 
     let i = System.BitConverter.ToInt32(b, c_PeHeaderOffset) 
     let secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset) 
     let dt = System.DateTime(1970, 1, 1, 0, 0, 0) 
     let dt1 = dt.AddSeconds(float(secondsSince1970)) 
     dt1.AddHours(float(System.TimeZone.CurrentTimeZone.GetUtcOffset(dt1).Hours)) 

這不是很漂亮,但它的工作原理。我將它作爲一種類型編寫,以便可以從其他.NET代碼輕鬆訪問它。