anchor.diff:                      if not (Directory.Exists(dir)) then Directory.CreateDirectory(dir) |>ignore
                       new BinaryWriter(System.IO.File.OpenWrite(outfile))
                   with e -> 
  -                    failwith ("Could not open file for writing (binary mode): " + outfile)    
  +                    failwith ("Could not open file for writing (binary mode): " + outfile + "\n" + e.ToString())    
   
               let pdbData, pdbOpt, debugDirectoryChunk, debugDataChunk, debugEmbeddedPdbChunk, textV2P, mappings =
                   try 
  
positive.code:             | null     -> [| et_STRING  |]// yes, the 0xe prefix is used when passing a "null" to a property or argument of type "object" here
              | :? single   -> [| et_R4 |]
              | :? double   -> [| et_R8 |]
              | :? (obj[]) as arr   -> failwith "TODO: can't yet emit arrays in attrs" // [| yield et_SZARRAY; yield! encodeCustomAttrElemType elemTy |]
              | _   -> failwith "unexpected value in custom attribute" 
  
          /// Given a custom attribute element, encode it to a binary representation according to the rules in Ecma 335 Partition II.
  
negative.code:         type FieldDefKey(tidx:int, nm:string, ty:ILType) = 
              // precompute the hash. hash doesn't include the type 
              let hashCode = hash tidx |> combineHash (hash nm) 
              member __.TypeIdx = tidx
              member __.Name = nm
              member __.Type = ty
              override __.GetHashCode() = hashCode
              override __.Equals(obj:obj) = 
                  match obj with 
                  | :? FieldDefKey as y -> 
                      tidx = y.TypeIdx && 
  