Esempio n. 1
0
        /// <summary>
        /// Creates the compile results for the specified <see cref="TypeContext"/>.
        /// </summary>
        /// <param name="context">The type context.</param>
        /// <returns>The compiler results.</returns>
        private CompilerResults Compile(TypeContext context)
        {
            var compileUnit = GetCodeCompileUnit(
                context.ClassName,
                context.TemplateContent,
                context.Namespaces,
                context.TemplateType,
                context.ModelType);

            var @params = new CompilerParameters {
                GenerateInMemory        = true,
                GenerateExecutable      = false,
                IncludeDebugInformation = false,
                CompilerOptions         = "/target:library /optimize",
            };

            var assemblies = CompilerServices
                             .GetLoadedAssemblies()
                             .Where(a => !a.IsDynamic)
                             .Select(a => a.Location)
                             .ToArray();

            @params.ReferencedAssemblies.AddRange(assemblies);

            if (Env.IsMono)
            {
                for (var i = @params.ReferencedAssemblies.Count - 1; i >= 0; i--)
                {
                    var assembly = @params.ReferencedAssemblies[i];
                    foreach (var filterAssembly in DuplicatedAssmebliesInMono)
                    {
                        if (assembly.Contains(filterAssembly))
                        {
                            @params.ReferencedAssemblies.RemoveAt(i);
                        }
                    }
                }
            }

            return(CodeDomProvider.CompileAssemblyFromDom(@params, compileUnit));
        }
Esempio n. 2
0
        public Type Compile()
        {
            Type forceLoadOfRuntimeBinder = typeof(Microsoft.CSharp.RuntimeBinder.Binder);

            if (forceLoadOfRuntimeBinder == null)
            {
                log.Warn("Force load of .NET 4.0+ RuntimeBinder in Microsoft.CSharp.dll");
            }

            var razorResults = Generate();

            var @params = new CompilerParameters
            {
                GenerateInMemory        = true,
                GenerateExecutable      = false,
                IncludeDebugInformation = false,
                CompilerOptions         = "/target:library /optimize",
                TempFiles = { KeepFiles = true }
            };

            var assemblies = CompilerServices
                             .GetLoadedAssemblies()
                             .Where(a => !a.IsDynamic)
                             .Select(a => a.Location)
                             .ToArray();

            @params.ReferencedAssemblies.AddRange(assemblies);

            //Compile the code
            var results = _codeDomProvider.CompileAssemblyFromDom(@params, razorResults.GeneratedCode);

            OnCodeCompletion();

            var tempFilesMarkedForDeletion = new TempFileCollection(null);

            @params.TempFiles
            .OfType <string>()
            .ForEach(file => tempFilesMarkedForDeletion.AddFile(file, false));

            using (tempFilesMarkedForDeletion)
            {
                if (results.Errors != null && results.Errors.HasErrors)
                {
                    //check if source file exists, read it.
                    //HttpCompileException is sealed by MS. So, we'll
                    //just add a property instead of inheriting from it.
                    var sourceFile = results.Errors
                                     .OfType <CompilerError>()
                                     .First(ce => !ce.IsWarning)
                                     .FileName;

                    var sourceCode = "";
                    if (!string.IsNullOrEmpty(sourceFile) && System.IO.File.Exists(sourceFile))
                    {
                        sourceCode = System.IO.File.ReadAllText(sourceFile);
                    }
                    else
                    {
                        foreach (string tempFile in @params.TempFiles)
                        {
                            if (tempFile.EndsWith(".cs"))
                            {
                                sourceCode = System.IO.File.ReadAllText(tempFile);
                            }
                        }
                    }
                    throw new HttpCompileException(results, sourceCode);
                }

#if DEBUG
                foreach (string tempFile in @params.TempFiles)
                {
                    if (tempFile.EndsWith(".cs"))
                    {
                        var sourceCode = System.IO.File.ReadAllText(tempFile);
                        //sourceCode.Print();
                    }
                }
#endif

                return(results.CompiledAssembly.GetTypes().First());
            }
        }
        public Type Compile()
        {
            Type forceLoadOfRuntimeBinder = typeof(Microsoft.CSharp.RuntimeBinder.Binder);

            if (forceLoadOfRuntimeBinder == null)
            {
                log.Warn("Force load of .NET 4.0+ RuntimeBinder in Microsoft.CSharp.dll");
            }

            var razorResults = Generate();

            var @params = new CompilerParameters
            {
                GenerateInMemory        = true,
                GenerateExecutable      = false,
                IncludeDebugInformation = IncludeDebugInformation,
                CompilerOptions         = "/target:library" + (IncludeDebugInformation ? "" : " /optimize"),
                TempFiles = { KeepFiles = true }
            };

            var assemblies = CompilerServices
                             .GetLoadedAssemblies()
                             .Where(a => !a.IsDynamic);

            if (Env.IsMono)
            {
                //workaround mono not handling duplicate dll references (i.e. in GAC)
                var uniqueNames = new HashSet <string>();
                assemblies = assemblies.Where(x =>
                {
                    var id = x.GetName().Name;
                    if (string.IsNullOrEmpty(id))
                    {
                        return(true);
                    }
                    if (uniqueNames.Contains(id))
                    {
                        return(false);
                    }
                    if (!id.Contains("<"))
                    {
                        uniqueNames.Add(x.GetName().Name);
                    }
                    return(true);
                });
            }

            var assemblyNames = assemblies
                                .Select(a => a.Location)
                                .ToArray();

            @params.ReferencedAssemblies.AddRange(assemblyNames);

            if (CompileFilter != null)
            {
                CompileFilter(@params);
            }

            //Compile the code
            var results = _codeDomProvider.CompileAssemblyFromDom(@params, razorResults.GeneratedCode);

            var tempFilesMarkedForDeletion = new TempFileCollection(null);

            foreach (var file in @params.TempFiles.OfType <string>())
            {
                tempFilesMarkedForDeletion.AddFile(file, false);
            }

            using (tempFilesMarkedForDeletion)
            {
                if (results.Errors != null && results.Errors.HasErrors)
                {
                    //check if source file exists, read it.
                    //HttpCompileException is sealed by MS. So, we'll
                    //just add a property instead of inheriting from it.
                    var sourceFile = results.Errors
                                     .OfType <CompilerError>()
                                     .First(ce => !ce.IsWarning)
                                     .FileName;

                    var sourceCode = "";
                    if (!string.IsNullOrEmpty(sourceFile) && System.IO.File.Exists(sourceFile))
                    {
                        sourceCode = System.IO.File.ReadAllText(sourceFile);
                    }
                    else
                    {
                        foreach (string tempFile in @params.TempFiles)
                        {
                            if (tempFile.EndsWith(".cs"))
                            {
                                sourceCode = System.IO.File.ReadAllText(tempFile);
                            }
                        }
                    }
                    throw new HttpCompileException(results, sourceCode);
                }

#if DEBUG
                foreach (string tempFile in @params.TempFiles)
                {
                    if (tempFile.EndsWith(".cs"))
                    {
                        var sourceCode = System.IO.File.ReadAllText(tempFile);
                        //sourceCode.Print();
                    }
                }
#endif

                return(results.CompiledAssembly.GetTypes().First());
            }
        }
        /// <summary>
        /// Creates the compile results for the specified <see cref="TypeContext"/>.
        /// </summary>
        /// <param name="context">The type context.</param>
        /// <returns>The compiler results.</returns>
        private CompilerResults Compile(TypeContext context)
        {
            var compileUnit = GetCodeCompileUnit(
                context.ClassName,
                context.TemplateContent,
                context.Namespaces,
                context.TemplateType,
                context.ModelType);

            var @params = new CompilerParameters {
                GenerateInMemory        = true,
                GenerateExecutable      = false,
                IncludeDebugInformation = false,
                CompilerOptions         = "/target:library /optimize",
                TempFiles = { KeepFiles = true }
            };

            var assemblies = CompilerServices
                             .GetLoadedAssemblies()
                             .Where(a => !a.IsDynamic)
                             .Select(a => a.Location)
                             .ToArray();

            @params.ReferencedAssemblies.AddRange(assemblies);

            if (Env.IsMono)
            {
                for (var i = @params.ReferencedAssemblies.Count - 1; i >= 0; i--)
                {
                    var assembly = @params.ReferencedAssemblies[i];
                    foreach (var filterAssembly in DuplicatedAssmebliesInMono)
                    {
                        if (assembly.Contains(filterAssembly))
                        {
                            @params.ReferencedAssemblies.RemoveAt(i);
                        }
                    }
                }
            }

            var results = CodeDomProvider.CompileAssemblyFromDom(@params, compileUnit);

            //Tricky: Don't forget to cleanup.
            // Simply setting KeepFiles = false and then calling
            // dispose on the parent TempFilesCollection won't
            // clean up. So, create a new collection and
            // explicitly mark the files for deletion.
            var tempFilesMarkedForDeletion = new TempFileCollection(null);

            @params.TempFiles
            .OfType <string>()
            .ForEach(file => tempFilesMarkedForDeletion.AddFile(file, false));

            using ( tempFilesMarkedForDeletion )
            {
                if (results.Errors != null && results.Errors.HasErrors)
                {
                    throw new TemplateCompilationException(results);
                }

                return(results);
            }
        }