Exemplo n.º 1
0
        public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
        {
            if (!WillProcess(compiledAssembly))
            {
                return(null);
            }

            var assemblyDefinition = Utils.LoadAssemblyDefinition(compiledAssembly);

            var generator = new InjectionILGenerator(
                assemblyDefinition.MainModule,
                VContainerSettings.Instance.CodeGen.Namespaces);

            if (generator.TryGenerate(out var diagnosticMessages))
            {
                if (diagnosticMessages.Any(d => d.DiagnosticType == DiagnosticType.Error))
                {
                    return(new ILPostProcessResult(null, diagnosticMessages));
                }

                var pe  = new MemoryStream();
                var pdb = new MemoryStream();
                var writerParameters = new WriterParameters
                {
                    SymbolWriterProvider = new PortablePdbWriterProvider(),
                    SymbolStream         = pdb,
                    WriteSymbols         = true
                };

                assemblyDefinition.Write(pe, writerParameters);

                return(new ILPostProcessResult(new InMemoryAssembly(pe.ToArray(), pdb.ToArray()), diagnosticMessages));
            }
            return(new ILPostProcessResult(null, diagnosticMessages));
        }
Exemplo n.º 2
0
        public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
        {
            if (!WillProcess(compiledAssembly))
            {
                return(null);
            }

            var assemblyDefinition = Utils.LoadAssemblyDefinition(compiledAssembly);
            var generator          = new InjectionILGenerator(assemblyDefinition.MainModule, compiledAssembly, null);

            if (generator.TryGenerate(out var diagnosticMessages))
            {
                if (diagnosticMessages.Any(d => d.DiagnosticType == DiagnosticType.Error))
                {
                    return(new ILPostProcessResult(null, diagnosticMessages));
                }

                // TODO:
                var(selfReference, selfReferenceIndex) = assemblyDefinition.MainModule.AssemblyReferences
                                                         .Select((x, i) => (x, i))
                                                         .FirstOrDefault(e => e.x.Name == assemblyDefinition.Name.Name);

                if (selfReference != null)
                {
                    assemblyDefinition.MainModule.AssemblyReferences.RemoveAt(selfReferenceIndex);
                }

                var pe  = new MemoryStream();
                var pdb = new MemoryStream();
                var writerParameters = new WriterParameters
                {
                    SymbolWriterProvider = new PortablePdbWriterProvider(),
                    SymbolStream         = pdb,
                    WriteSymbols         = true
                };

                assemblyDefinition.Write(pe, writerParameters);

                return(new ILPostProcessResult(new InMemoryAssembly(pe.ToArray(), pdb.ToArray()), diagnosticMessages));
            }
            return(new ILPostProcessResult(null, diagnosticMessages));
        }