anchor.diff:                                         m.Groups.["value"].Value,
                                          ""))
   
  +/// Read a single attribute from an AssemblyInfo file.
  +/// ## Parameters
  +///  - `attrName` - Name of the attribute without "Attribute" at the end.
  +///  - `assemblyInfoFile` - The file to read from. Language C#, F#, VB or C++ is determined from the extension. 
   let GetAttribute attrName assemblyInfoFile =
       assemblyInfoFile |> GetAttributes |> Seq.tryFind (fun a -> a.Name = attrName) 
       
  +/// Read the value of a single attribute from an AssemblyInfo file. Note that string values are returned with surrounding "".
  +/// ## Parameters
  +///  - `attrName` - Name of the attribute without "Attribute" at the end.
  +///  - `assemblyInfoFile` - The file to read from. Language C#, F#, VB or C++ is determined from the extension. 
   let GetAttributeValue attrName assemblyInfoFile =
       match GetAttribute attrName assemblyInfoFile with
       | Some attr -> Some attr.Value
  
positive.code:     else
          text
  
  let GetAttributes assemblyInfoFile =
      let text = File.ReadAllText assemblyInfoFile
  
  
negative.code:     else
          failwithf "Attribute '%s' not found" attribute.Name
  
  /// Update a set of attributes in an AssemblyInfo file. Fails if any attribute is not found.
  /// ## Parameters
  ///  - `assemblyInfoFile` - The file to update. Language C#, F#, VB or C++ is determined from the extension. 
  ///  - `attributes` - The Attributes that should be updated matched on Name (Namespace is not used).
  let UpdateAttributes assemblyInfoFile (attributes: seq<Attribute>) =
      tracefn "Updating attributes in: %s" assemblyInfoFile
  
  