3

我希望在我的 DLL 中包含一个函数,该函数给出构建时间或自动构建编号。虽然有很多 C# 示例,但我还没有看到 F# 的任何内容。如果可能的话,我想在没有外部包或 C# 层的情况下做到这一点。

4

2 回答 2

2

干得好。我从这里移植了代码:

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

于 2013-09-30T14:11:40.660 回答
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
于 2013-09-30T14:29:52.053 回答