예제 #1
0
 public ScriptContext(ScriptProjectProvider scriptProjectProvider, HashSet <MetadataReference> metadataReferences, CompilationDependency[] compilationDependencies, Type globalsType)
 {
     ScriptProjectProvider   = scriptProjectProvider;
     MetadataReferences      = metadataReferences;
     CompilationDependencies = compilationDependencies;
     GlobalsType             = globalsType;
 }
예제 #2
0
 public ScriptContext(ScriptProjectProvider scriptProjectProvider, HashSet <MetadataReference> metadataReferences, HashSet <string> assemblyReferences, CompilationDependency[] compilationDependencies)
 {
     ScriptProjectProvider   = scriptProjectProvider;
     MetadataReferences      = metadataReferences;
     AssemblyReferences      = assemblyReferences;
     CompilationDependencies = compilationDependencies;
 }
 public ScriptProjectSystem(OmniSharpWorkspace workspace, IOmniSharpEnvironment env, ILoggerFactory loggerFactory, MetadataFileReferenceCache metadataFileReferenceCache)
 {
     _metadataFileReferenceCache = metadataFileReferenceCache;
     _workspace             = workspace;
     _env                   = env;
     _logger                = loggerFactory.CreateLogger <ScriptProjectSystem>();
     _projects              = new Dictionary <string, ProjectInfo>();
     _scriptProjectProvider = ScriptProjectProvider.Create(loggerFactory);
 }
예제 #4
0
        public ScriptContext CreateScriptContext(ScriptOptions scriptOptions)
        {
            var currentDomainAssemblies = AppDomain.CurrentDomain.GetAssemblies();

            // explicitly inherit scripting library references to all global script object (CommandLineScriptGlobals) to be recognized
            var inheritedCompileLibraries = currentDomainAssemblies.Where(x =>
                                                                          x.FullName.StartsWith("microsoft.codeanalysis", StringComparison.OrdinalIgnoreCase)).ToList();

            // explicitly include System.ValueTuple
            inheritedCompileLibraries.AddRange(currentDomainAssemblies.Where(x =>
                                                                             x.FullName.StartsWith("system.valuetuple", StringComparison.OrdinalIgnoreCase)));

            CompilationDependency[] compilationDependencies = null;
            try
            {
                _logger.LogInformation($"Searching for compilation dependencies with the fallback framework of '{scriptOptions.DefaultTargetFramework}'.");
                compilationDependencies = _compilationDependencyResolver.GetDependencies(_env.TargetDirectory, scriptOptions.IsNugetEnabled(), scriptOptions.DefaultTargetFramework).ToArray();
            }
            catch (Exception e)
            {
                _logger.LogError("Failed to resolve compilation dependencies", e);
                compilationDependencies = Array.Empty <CompilationDependency>();
            }

            var metadataReferences = new HashSet <MetadataReference>(MetadataReferenceEqualityComparer.Instance);
            var assemblyReferences = new HashSet <string>();

            var isDesktopClr = true;

            // if we have no compilation dependencies
            // we will assume desktop framework
            // and add default CLR references
            // same applies for having a context that is not a .NET Core app
            if (!compilationDependencies.Any())
            {
                _logger.LogInformation("Unable to find dependency context for CSX files. Will default to non-context usage (Desktop CLR scripts).");
                AddDefaultClrMetadataReferences(metadataReferences, assemblyReferences);
            }
            else
            {
                isDesktopClr = false;
                HashSet <string> loadedFiles = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

                foreach (var compilationAssembly in compilationDependencies.SelectMany(cd => cd.AssemblyPaths).Distinct())
                {
                    if (loadedFiles.Add(Path.GetFileName(compilationAssembly)))
                    {
                        _logger.LogDebug("Discovered script compilation assembly reference: " + compilationAssembly);
                        AddMetadataReference(metadataReferences, assemblyReferences, compilationAssembly);
                    }
                }
            }

            // inject all inherited assemblies
            foreach (var inheritedCompileLib in inheritedCompileLibraries)
            {
                _logger.LogDebug("Adding implicit reference: " + inheritedCompileLib);
                AddMetadataReference(metadataReferences, assemblyReferences, inheritedCompileLib.Location);
            }

            var scriptProjectProvider = new ScriptProjectProvider(scriptOptions, _env, _loggerFactory, isDesktopClr);

            return(new ScriptContext(scriptProjectProvider, metadataReferences, assemblyReferences, compilationDependencies, _defaultGlobalsType));
        }