用F#构建数字

时间:2013-09-30 13:43:44

标签: visual-studio-2010 f#

我希望在我的DLL中包含一个函数,它提供构建时间或autobuild数字。虽然有很多C#例子,但我还没有看到任何关于F#的东西。如果可能,我想在没有外部包或C#层的情况下这样做。

2 个答案:

答案 0 :(得分: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代码轻松访问它。

答案 1 :(得分: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