2013-09-30 24 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代码轻松访问它。