anchor.diff:              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
  +        type CacheValue = ILModuleReader * DateTime
           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>()
  +        let readersWeakCache = ConcurrentDictionary<(string * string), WeakReference>()
   
           type File with 
               static member ReadBinaryChunk (fileName: string, start, len) = 
  
positive.code: 
          let ILModuleReaderAfterReadingAllBytes  (fileName:string, ilGlobals: ILGlobals) =
              let timeStamp = File.GetLastWriteTimeUtc(fileName)
              let key = (fileName, timeStamp, ilGlobals.systemRuntimeScopeRef.QualifiedName)
              match readersWeakCache.TryGetValue (key) with
              | true, CacheValue mr2 ->
                  mr2 // throw away the bytes we just read and recycle the existing ILModuleReader
              | _ ->
                  let bytes = File.ReadAllBytes fileName
  
negative.code:                 let mdchunk = File.ReadBinaryChunk (fileName, pe.MetadataPhysLoc, pe.MetadataSize)
                  let mdfile = ByteFile(mdchunk)
                  let mr = ILModuleReader(fileName, mdfile, ilGlobals, true)
                  readersWeakCache.[key] <- CacheValue (mr, timeStamp)
                  mr
  
  
  