/// <summary> /// This methods is called after trying to continue with editted code. /// It gets a result of searching changes in code and applies them to /// running process if it is possible. /// <param name="eventLog">Contains changes done to code during pause.</param> /// </summary> private bool patchWithEnC(EditorEvent eventLog) { // Build new version of assembly. resource.Load(eventLog.touched); // Exit when errors in compiling if (!resource.CompileSuccessful) { return false; } metadata.Update(); byte[] dmeta = null, dil = null; DeltaBuilder dBuilder = new DeltaBuilder(this); // Initialize symbol emitter. SymbolWriterClass dWriter = new SymbolWriterClass(this, metadata); dWriter.Initialize(metadata.OldEmitter.CorMetaDataEmit, metadata.NewImporter.CorMetaDataImport); dBuilder.SymbolWriter = dWriter; // Process changes and tries to make delta metadata and IL code. // If changes not valid exits. try { if (!processChanges(eventLog, dBuilder)) { return false; } process.AppDomains.ForEach(delegate(AppDomain app) { app.ResetCache(); }); regenMovedSymbols(dWriter, lastEvent); // Update symbols emitted during changes. updateSymbolStore(dWriter); dWriter.Close(); // Recieve deltas and applies them to running module dil = dBuilder.getDeltaIL(); dmeta = dBuilder.getDeltaMetadata(); resource.CurrentModule.ApplyChanges(dmeta, dil); // Log output if in debug mode if (debugMode) { StreamWriter writer = new StreamWriter(resource.TemporaryPath + "enc_log_il"); writer.BaseStream.Write(dil, 0, dil.Length); writer.Flush(); writer.Close(); writer = new StreamWriter(resource.TemporaryPath + "enc_log_meta"); writer.BaseStream.Write(dmeta, 0, dmeta.Length); writer.Flush(); writer.Close(); } funcRemap = new FunctionRemapper(this, dBuilder.SequencePointRemappers); updateBreakpoints(); return true; } catch (TranslatingException e) { dWriter.Close(); TaskService.Clear(); WorkbenchSingleton.SafeThreadAsyncCall( delegate() { TaskService.Clear(); TaskService.Add(new Task(null, e.Message, 0, 0, TaskType.Error)); } ); return false; } }
/// <summary> /// This methods is called after trying to continue with editted code. /// It gets a result of searching changes in code and applies them to /// running process if it is possible. /// <param name="eventLog">Contains changes done to code during pause.</param> /// </summary> private bool patchWithEnC(EditorEvent eventLog) { // Build new version of assembly. resource.Load(eventLog.touched); // Exit when errors in compiling if (!resource.CompileSuccessful) { return(false); } metadata.Update(); byte[] dmeta = null, dil = null; DeltaBuilder dBuilder = new DeltaBuilder(this); // Initialize symbol emitter. SymbolWriterClass dWriter = new SymbolWriterClass(this, metadata); dWriter.Initialize(metadata.OldEmitter.CorMetaDataEmit, metadata.NewImporter.CorMetaDataImport); dBuilder.SymbolWriter = dWriter; // Process changes and tries to make delta metadata and IL code. // If changes not valid exits. try { if (!processChanges(eventLog, dBuilder)) { return(false); } process.AppDomains.ForEach(delegate(AppDomain app) { app.ResetCache(); }); regenMovedSymbols(dWriter, lastEvent); // Update symbols emitted during changes. updateSymbolStore(dWriter); dWriter.Close(); // Recieve deltas and applies them to running module dil = dBuilder.getDeltaIL(); dmeta = dBuilder.getDeltaMetadata(); resource.CurrentModule.ApplyChanges(dmeta, dil); // Log output if in debug mode if (debugMode) { StreamWriter writer = new StreamWriter(resource.TemporaryPath + "enc_log_il"); writer.BaseStream.Write(dil, 0, dil.Length); writer.Flush(); writer.Close(); writer = new StreamWriter(resource.TemporaryPath + "enc_log_meta"); writer.BaseStream.Write(dmeta, 0, dmeta.Length); writer.Flush(); writer.Close(); } funcRemap = new FunctionRemapper(this, dBuilder.SequencePointRemappers); updateBreakpoints(); return(true); } catch (TranslatingException e) { dWriter.Close(); TaskService.Clear(); WorkbenchSingleton.SafeThreadAsyncCall( delegate() { TaskService.Clear(); TaskService.Add(new Task(null, e.Message, 0, 0, TaskType.Error)); } ); return(false); } }