static LoadedAssembly TryReadFromCache(string cacheFileName, DateTime lastWriteTime)
 {
     if (cacheFileName == null || !File.Exists(cacheFileName))
         return null;
     //LoggingService.Debug("Deserializing " + cacheFileName);
     try {
         using (FileStream fs = new FileStream(cacheFileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, 4096, FileOptions.SequentialScan)) {
             using (BinaryReader reader = new BinaryReaderWith7BitEncodedInts(fs)) {
                 if (reader.ReadInt64() != lastWriteTime.Ticks) {
                     LoggingService.Debug("Timestamp mismatch, deserialization aborted. (" + cacheFileName + ")");
                     return null;
                 }
                 FastSerializer s = new FastSerializer();
                 return s.Deserialize(reader) as LoadedAssembly;
             }
         }
     } catch (IOException ex) {
         LoggingService.Warn(ex);
         return null;
     } catch (UnauthorizedAccessException ex) {
         LoggingService.Warn(ex);
         return null;
     } catch (SerializationException ex) {
         LoggingService.Warn(ex);
         return null;
     }
 }
		static IProjectContent TryReadFromCache(string cacheFileName)
		{
			if (cacheFileName == null || !File.Exists(cacheFileName))
				return null;
			LoggingService.Debug("Deserializing " + cacheFileName);
			try {
				using (FileStream fs = new FileStream(cacheFileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, 4096, FileOptions.SequentialScan)) {
					using (BinaryReader reader = new BinaryReaderWith7BitEncodedInts(fs)) {
						if (reader.ReadInt32() != cacheMagicNumber) {
							LoggingService.Warn("Incorrect magic number");
							return null;
						}
						FastSerializer s = new FastSerializer();
						return (IProjectContent)s.Deserialize(reader);
					}
				}
			} catch (IOException ex) {
				LoggingService.Warn(ex);
				return null;
			} catch (UnauthorizedAccessException ex) {
				LoggingService.Warn(ex);
				return null;
			} catch (SerializationException ex) {
				LoggingService.Warn(ex);
				return null;
			} catch (InvalidCastException ex) {
				// can happen if serialized types are incompatible to expected types
				LoggingService.Warn(ex);
				return null;
			} catch (FormatException ex) {
				// e.g. invalid 7-bit-encoded int
				LoggingService.Warn(ex);
				return null;
			}
		}