Example #1
0
        internal string[] AggregateReferencedAssemblies(ScriptParser parser)
        {
            UniqueAssemblyLocations requestedRefAsms = new UniqueAssemblyLocations();

#if net1
            ArrayList refAssemblies = new ArrayList();
#else
            List<string> refAssemblies = new List<string>();
#endif
            if (options.shareHostRefAssemblies)
                foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
                {
                    try
                    {
                        if (CSSUtils.IsDynamic(asm))
                            continue;

                        if (!File.Exists(asm.Location) || asm.Location.Contains("mscorlib"))
                            continue;

                        requestedRefAsms.AddAssembly(asm.Location);
                    }
                    catch
                    {
                        //Under ASP.NET some assemblies do not have location (e.g. dynamically built/emitted assemblies)
                        //in such case NotSupportedException will be raised

                        //In fact ignore all exceptions as we should continue if for whatever reason assembly the location cannot be obtained
                    }
                }

            //add assemblies referenced from command line
            string[] cmdLineAsms = options.refAssemblies;
            if (!options.useSurrogateHostingProcess)
            {
                string[] defaultAsms = options.defaultRefAssemblies.Replace(" ", "").Split(";,".ToCharArray());

                foreach (string asmName in Utils.Concat(defaultAsms, cmdLineAsms))
                {
                    if (asmName == "")
                        continue;

                    string[] files = AssemblyResolver.FindAssembly(asmName, options.searchDirs);
                    if (files.Length > 0)
                    {
                        foreach (string asm in files)
                            requestedRefAsms.AddAssembly(NormalizeGacAssemblyPath(asm));
                    }
                    else
                    {
                        requestedRefAsms.AddAssembly(asmName);
                    }
                }
            }

            AssemblyResolver.ignoreFileName = Path.GetFileNameWithoutExtension(parser.ScriptPath) + ".dll";

            //add assemblies referenced from code
            foreach (string asmName in parser.ResolvePackages())
                requestedRefAsms.AddAssembly(asmName);

            //add assemblies referenced from code
            foreach (string asmName in parser.ReferencedAssemblies)
            {
                string asm = asmName.Replace("\"", "");

                if (Path.IsPathRooted(asm)) //absolute path
                {
                    //not-searchable assemblies
                    if (File.Exists(asm))
                        requestedRefAsms.AddAssembly(NormalizeGacAssemblyPath(asm));
                }
                else
                {
                    string[] files = AssemblyResolver.FindAssembly(asm, options.searchDirs);
                    if (files.Length > 0)
                    {
                        foreach (string asmFile in files)
                            requestedRefAsms.AddAssembly(NormalizeGacAssemblyPath(asmFile));
                    }
                    else
                    {
                        requestedRefAsms.AddAssembly(asm);
                    }
                }
            }

            bool disableNamespaceResolving = false;
            if (parser.IgnoreNamespaces.Length == 1 && parser.IgnoreNamespaces[0] == "*")
                disableNamespaceResolving = true;

            if (!disableNamespaceResolving)
            {
                //add local and global assemblies (if found) that have the same assembly name as a namespace
                foreach (string nmSpace in parser.ReferencedNamespaces)
                {
                    bool ignore = false; //user may nominate namespaces to be excluded fro namespace-to-asm resolving
                    foreach (string ignoreNamespace in parser.IgnoreNamespaces)
                        if (ignoreNamespace == nmSpace)
                            ignore = true;

                    if (!ignore)
                    {
                        bool alreadyFound = requestedRefAsms.ContainsAssembly(nmSpace);
                        if (!alreadyFound)
                            foreach (string asm in AssemblyResolver.FindAssembly(nmSpace, options.searchDirs))
                                requestedRefAsms.AddAssembly(NormalizeGacAssemblyPath(asm));
                    }
                }
            }

            return (string[]) requestedRefAsms;
        }
Example #2
0
        /// <summary>
        /// Compiles an assembly for a specific invoker type
        /// </summary>
        private static bool compile(List <ScriptParser> parsers, string[] sources, string[] namespaces)
        {               //Obtain our compiler
            var providerOptions = new Dictionary <string, string>();

            providerOptions.Add("CompilerVersion", "v4.0");

            CodeDomProvider compiler = new CSharpCodeProvider(providerOptions);

            //Prepare the compiler settings
            CompilerParameters compilerParams = new CompilerParameters();

            //We want debug information
            compilerParams.CompilerOptions        += " /d:DEBUG /d:TRACE";
            compilerParams.IncludeDebugInformation = true;

            //We want to generate a dll
            compilerParams.GenerateExecutable = false;
            compilerParams.GenerateInMemory   = false;

            //Load all referenced assemblies in each script
            UniqueAssemblyLocations requestedRefAsms = new UniqueAssemblyLocations();

            //Add every assembly in our current appdomain
            foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
            {
                try
                {
                    requestedRefAsms.AddAssembly(asm.Location);
                }
                catch (ArgumentException)
                {
                    //Seem to sometimes encounter bogus paths for some reason
                }
                catch (NotSupportedException)
                {
                    //under ASP.NET some assemblies do not have a location (e.g. dynamically built/emitted assemblies)
                }
            }

            //Resolve and add each namespace
            string[] searchDirs = getIncludeDirs().ToArray();

            foreach (string asmspace in namespaces)
            {                   //Find the assemblies for the namespace
                string[] assemblies = AssemblyResolver.FindAssembly(asmspace, searchDirs);

                foreach (string asm in assemblies)
                {
                    requestedRefAsms.AddAssembly(asm);
                }
            }

            //Cater for linq
            requestedRefAsms.AddAssembly(AssemblyResolver.FindAssembly("System.Core", new string[0])[0]);

            compilerParams.ReferencedAssemblies.AddRange((string[])requestedRefAsms);

            foreach (string sref in compilerParams.ReferencedAssemblies)
            {
                Log.write(TLog.Inane, "\t- Ref: " + sref);
            }

            //Determine our output assembly filename
            string compiledAssembly = System.Environment.CurrentDirectory + "\\scripts.cmp";

            if (File.Exists(compiledAssembly))
            {
                File.Delete(compiledAssembly);
            }

            compilerParams.OutputAssembly = compiledAssembly;

            //Attempt to compile
            CompilerResults results = compiler.CompileAssemblyFromFile(compilerParams, sources);

            //If there were errors..
            if (results.Errors.Count > 0)
            {                   //Let's be so kind as to describe them
                string result = "Errors whilst compiling script code:\n";

                foreach (CompilerError err in results.Errors)
                {                       //As long as it's not a warning, append the error
                    if (err.IsWarning)
                    {
                        continue;
                    }

                    //We need to fix the script name, get the associated script
                    foreach (ScriptParser parser in parsers)
                    {                           //Is this the file?
                        if (parser.m_preparedFile.Equals(err.FileName, StringComparison.CurrentCultureIgnoreCase))
                        {                       //If it was temped, use the real path
                            if (parser.m_bTemped)
                            {
                                err.FileName = parser.m_filepath;
                            }
                            break;
                        }
                    }

                    result += err.ToString() + "\n\n";
                }

                //Throw eet
                throw new ApplicationException(result);
            }

            //We're good, grab our assembly
            _scripts = results.CompiledAssembly;

            //Done!
            Log.write("\tCompile successful!");
            return(true);
        }
Example #3
0
        /// <summary>
        /// Compiles an assembly for a specific invoker type
        /// </summary>
        private static bool compile(List<ScriptParser> parsers, string[] sources, string[] namespaces)
        {
            //Obtain our compiler
            var providerOptions = new Dictionary<string, string>();
            providerOptions.Add("CompilerVersion", "v4.0");

            CodeDomProvider compiler = new CSharpCodeProvider(providerOptions);

            //Prepare the compiler settings
            CompilerParameters compilerParams = new CompilerParameters();

            //We want debug information
            compilerParams.CompilerOptions += " /d:DEBUG /d:TRACE";
            compilerParams.IncludeDebugInformation = true;

            //We want to generate a dll
            compilerParams.GenerateExecutable = false;
            compilerParams.GenerateInMemory = false;

            //Load all referenced assemblies in each script
            UniqueAssemblyLocations requestedRefAsms = new UniqueAssemblyLocations();

            //Add every assembly in our current appdomain
            foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
            {
                try
                {
                    requestedRefAsms.AddAssembly(asm.Location);
                }
                catch (ArgumentException)
                {
                    //Seem to sometimes encounter bogus paths for some reason
                }
                catch (NotSupportedException)
                {
                    //under ASP.NET some assemblies do not have a location (e.g. dynamically built/emitted assemblies)
                }
            }

            //Resolve and add each namespace
            string[] searchDirs = getIncludeDirs().ToArray();

            foreach (string asmspace in namespaces)
            {	//Find the assemblies for the namespace
                string[] assemblies = AssemblyResolver.FindAssembly(asmspace, searchDirs);

                foreach (string asm in assemblies)
                    requestedRefAsms.AddAssembly(asm);
            }

            //Cater for linq
            requestedRefAsms.AddAssembly(AssemblyResolver.FindAssembly("System.Core", new string[0])[0]);

            compilerParams.ReferencedAssemblies.AddRange((string[])requestedRefAsms);

            foreach (string sref in compilerParams.ReferencedAssemblies)
                Log.write(TLog.Inane, "\t- Ref: " + sref);

            //Determine our output assembly filename
            string compiledAssembly = System.Environment.CurrentDirectory + "\\scripts.cmp";

            if (File.Exists(compiledAssembly))
                File.Delete(compiledAssembly);

            compilerParams.OutputAssembly = compiledAssembly;

            //Attempt to compile
            CompilerResults results = compiler.CompileAssemblyFromFile(compilerParams, sources);

            //If there were errors..
            if (results.Errors.Count > 0)
            {	//Let's be so kind as to describe them
                string result = "Errors whilst compiling script code:\n";

                foreach (CompilerError err in results.Errors)
                {	//As long as it's not a warning, append the error
                    if (err.IsWarning)
                        continue;

                    //We need to fix the script name, get the associated script
                    foreach (ScriptParser parser in parsers)
                    {	//Is this the file?
                        if (parser.m_preparedFile.Equals(err.FileName, StringComparison.CurrentCultureIgnoreCase))
                        {	//If it was temped, use the real path
                            if (parser.m_bTemped)
                                err.FileName = parser.m_filepath;
                            break;
                        }
                    }

                    result += err.ToString() + "\n\n";
                }

                //Throw eet
                throw new ApplicationException(result);
            }

            //We're good, grab our assembly
            _scripts = results.CompiledAssembly;

            //Done!
            Log.write("\tCompile successful!");
            return true;
        }