public void Add(ILPostProcessorData postProcessor)
 {
     lock (lockObject)
     {
         postProcessors.Add(postProcessor);
     }
 }
 public void Remove(ILPostProcessorData postProcessor)
 {
     lock (lockObject)
     {
         postProcessors.Remove(postProcessor);
     }
 }
        List <DiagnosticMessage> RunILPostProcessors(ScriptAssembly assembly, string outputTempPath)
        {
            Profiler.BeginSample("CompilationPipeline.RunILPostProcessors");
            var assemblyPath = Path.Combine(outputTempPath, assembly.Filename);

            var resultMessages = new List <DiagnosticMessage>();

            if (!File.Exists(assemblyPath))
            {
                resultMessages.Add(new DiagnosticMessage
                {
                    File           = assemblyPath,
                    MessageData    = $"Could not find {assemblyPath} for post processing",
                    DiagnosticType = DiagnosticType.Error,
                });
            }

            bool isILProcessed = false;
            var  ilPostProcessCompiledAssembly = new ILPostProcessCompiledAssembly(assembly, outputTempPath);

            InMemoryAssembly postProcessedInMemoryAssembly = null;

            foreach (var ilPostProcessor in ILPostProcessors)
            {
                Profiler.BeginSample($"{ilPostProcessor.GetType().FullName}.Process({assembly.Filename})");

                var stopwatch = new Stopwatch();
                stopwatch.Start();

                Console.WriteLine($"  - Starting ILPostProcessor '{ilPostProcessor.GetType().FullName}' on {assembly.Filename}");

                var ilPostProcessorInstance = ilPostProcessor.GetInstance();

                var ilPostProcessorData = new ILPostProcessorData {
                    postProcessor = ilPostProcessorInstance, scriptAssembly = assembly
                };
                RunningPostProcessors.Add(ilPostProcessorData);

                ILPostProcessResult ilPostProcessResult;
                try
                {
                    ilPostProcessResult = ilPostProcessorInstance.Process(ilPostProcessCompiledAssembly);
                }
                finally
                {
                    RunningPostProcessors.Remove(ilPostProcessorData);
                }

                stopwatch.Stop();

                Profiler.EndSample();

                var elapsed = stopwatch.Elapsed;

                Console.WriteLine($"  - Finished ILPostProcessor '{ilPostProcessor.GetType().FullName}' on {assembly.Filename} in {elapsed.TotalSeconds:0.######} seconds");
                postProcessedInMemoryAssembly = ilPostProcessResult?.InMemoryAssembly;

                if (ilPostProcessResult?.InMemoryAssembly != null)
                {
                    isILProcessed = true;
                    ilPostProcessCompiledAssembly.InMemoryAssembly = postProcessedInMemoryAssembly;
                }

                if (ilPostProcessResult?.Diagnostics != null)
                {
                    resultMessages.AddRange(ilPostProcessResult.Diagnostics);
                }
            }

            if (isILProcessed)
            {
                ilPostProcessCompiledAssembly.WriteAssembly();
            }

            Profiler.EndSample();

            return(resultMessages);
        }