Пример #1
0
        /// <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;
            }
        }
Пример #2
0
        /// <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);
            }
        }