/// <summary> /// Reads the specified file from disk into a StateFileBase derived object. /// </summary> /// <param name="stateFile"></param> /// <returns></returns> static internal StateFileBase DeserializeCache(string stateFile, TaskLoggingHelper log, Type requiredReturnType) { StateFileBase retVal = null; // First, we read the cache from disk if one exists, or if one does not exist // then we create one. try { if (stateFile != null && stateFile.Length > 0 && File.Exists(stateFile)) { using (FileStream s = new FileStream(stateFile, FileMode.Open)) { BinaryFormatter formatter = new BinaryFormatter(); retVal = (StateFileBase)formatter.Deserialize(s); if ((retVal != null) && (!requiredReturnType.IsInstanceOfType(retVal))) { log.LogWarning("Could not write state file {0} (Incompatible state file type)", stateFile); retVal = null; } } } } catch (Exception e) { // The deserialization process seems like it can throw just about // any exception imaginable. Catch them all here. // Not being able to deserialize the cache is not an error, but we let the user know anyway. // Don't want to hold up processing just because we couldn't read the file. log.LogWarning("Could not read state file {0} ({1})", stateFile, e.Message); } return(retVal); }
/// <summary> /// Reads the .cache file from disk into a ResGenDependencies object. /// </summary> /// <param name="stateFile"></param> /// <param name="useSourcePath"></param> /// <returns></returns> internal static ResGenDependencies DeserializeCache(string stateFile, bool useSourcePath, TaskLoggingHelper log) { ResGenDependencies retVal = (ResGenDependencies)StateFileBase.DeserializeCache(stateFile, log, typeof(ResGenDependencies)); if (retVal == null) { retVal = new ResGenDependencies(); } // Ensure that the cache is properly initialized with respect to how resgen will // resolve linked files within .resx files. ResGen has two different // ways for resolving relative file-paths in linked files. The way // that ResGen resolved relative paths before Whidbey was always to // resolve from the current working directory. In Whidbey a new command-line // switch "/useSourcePath" instructs ResGen to use the folder that // contains the .resx file as the path from which it should resolve // relative paths. So we should base our timestamp/existence checking // on the same switch & resolve in the same manner as ResGen. retVal.UseSourcePath = useSourcePath; return(retVal); }