F# assembly level attributes, AssemblyInfo.fs, and do()

The project for this weekend is to create something that I can share with the rest of the web allowing one to create Web projects with F#. Part of doing this the right way is to include that handy dandy litany of assembly level attributes indicating things like assembly name, version, description, configuration, company, etc. In a C# project, this information appears in AssemblyInfo.cs. For my F# project, I figured that AssemblyInfo.fs is as good a place as any to start. So, how do you do this? Like in C#, assembly level attributes occur at file scope and have the word assembly: in front of the attribute. They wind up going into a file like so:


[<assembly: AssemblyVersion(“”)>]

[<assembly: AssemblyFileVersion(“”)>]


Now, AssemblyInfo.fs wasn’t going to have any types, and this frustrated the F# compiler a bit. After some tweaks, it coughed up a hint to use do(). So, I went ahead and put in:



open System.Reflection

open System.Runtime.CompilerServices

open System.Runtime.InteropServices

[<assembly: AssemblyVersion(“”)>]

[<assembly: AssemblyFileVersion(“”)>]


What is that do for? Looking at the spec, this is something called a do binding.do binds an expression and asserts that expression is equal to unit. Here, I’m binding to an empty tuple, so the dimension in unit. This is sufficient for the compiler to be happy and allow the attributes to be evaluated and added to the assembly at compile time.

  1. #1 by abatishchev on March 15, 2014 - 11:02 am

    Thanks! Having just `()` worked for me thought.

%d bloggers like this: