简体   繁体   中英

Build numbers in F#

I am looking to include a function in my DLL that gives the time of build, or an autobuild number. While are plenty of C# examples but I've haven't yet seen anything for F#. I would like to do this without external packages or a C# layer if possible.

Here you go. I ported the code from 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))

It's not pretty, but it works. I wrote it as a type so that it would be easily accessible from any other .NET code.

Last Modified

The following will tell you the last modified time of the assembly the function is located in

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

Version

To get the build number, you first have to add it the the F# program (its not there in the default template.) Add this to a F# source file in your project (eg Assemblyinfo.fs)

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

Note however that version 1.0.* does not work like in C# (in 2010), it will just auto-increment the minor and not the revision. 1.0.0.* increments the revision but not the minor.

Then you can read the assembly version as follows:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM