anchor.diff:                  let mdchunk = File.ReadBinaryChunk (fileName, pe.MetadataPhysLoc, pe.MetadataSize)
                   let mdfile = ByteFile(mdchunk)
                   let mr = ILModuleReader(fileName, mdfile, ilGlobals, true)
  -                readersWeakCache.[key] <- CacheValue (mr)
  +                readersWeakCache.[key] <- CacheValue (mr, timeStamp)
                   mr
   
   
  
positive.code:             with err -> 
                failwithf  "FAILED decodeILCustomAttribData, data.Length = %d, data = %A, meth = %A, argtypes = %A, fixedArgs=%A, nnamed = %A, sigptr before named = %A,  innerError = %A" bytes.Length bytes ca.Method.EnclosingType ca.Method.FormalArgTypes fixedArgs nnamed sigptr (err.ToString())
  
          type CacheValue = ILModuleReader
          let (|CacheValue|_|) (wr: WeakReference) = match wr.Target with null -> None | v -> Some (v :?> CacheValue)
          let CacheValue (reader: CacheValue) = System.WeakReference reader
  
          // Amortize readers weakly - this is enough that all the type providers in this DLL will at least share
          // resources when all instantiated at the same time.
          let readersWeakCache = ConcurrentDictionary<(string * DateTime * string), WeakReference>()
  
          type File with 
              static member ReadBinaryChunk (fileName: string, start, len) = 
  
negative.code: 
          let ILModuleReaderAfterReadingAllBytes  (fileName:string, ilGlobals: ILGlobals) =
              let timeStamp = File.GetLastWriteTimeUtc(fileName)
              let key = (fileName, ilGlobals.systemRuntimeScopeRef.QualifiedName)
              match readersWeakCache.TryGetValue (key) with
              | true, CacheValue (mr2, timeStamp2) when timeStamp = timeStamp2 ->
                  mr2 // throw away the bytes we just read and recycle the existing ILModuleReader
              | _ ->
                  let bytes = File.ReadAllBytes fileName
  