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; }
/// <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); }
/// <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; }