2013-09-30 6 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 코드에서 쉽게 액세스 할 수 있도록 형식으로 작성했습니다.