示例#1
0
        private static SdkResolverManifest ParseSdkResolverElement(XmlReader reader)
        {
            SdkResolverManifest manifest = new SdkResolverManifest();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                {
                    manifest.Path = reader.Name switch
                    {
                        "Path" => reader.ReadElementContentAsString(),
                        _ => throw new XmlException(ResourceUtilities.FormatResourceStringStripCodeAndKeyword("UnrecognizedElement", reader.Name)),
                    };
                }
                break;

                default:
                    throw new XmlException(ResourceUtilities.FormatResourceStringStripCodeAndKeyword("UnrecognizedElement", reader.Name));
                }
            }

            return(manifest);
        }
示例#2
0
        internal void InitializeForTests(SdkResolverLoader resolverLoader = null, IList <SdkResolver> resolvers = null)
        {
            if (resolverLoader != null)
            {
                _sdkResolverLoader = resolverLoader;
            }

            _specificResolversManifestsRegistry = null;
            _generalResolversManifestsRegistry  = null;
            _manifestToResolvers = null;
            _resolversList       = null;

            if (resolvers != null)
            {
                if (ChangeWaves.AreFeaturesEnabled(ChangeWaves.Wave17_4))
                {
                    _specificResolversManifestsRegistry = new List <SdkResolverManifest>();
                    _generalResolversManifestsRegistry  = new List <SdkResolverManifest>();
                    _manifestToResolvers = new Dictionary <SdkResolverManifest, IList <SdkResolver> >();

                    SdkResolverManifest sdkResolverManifest = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, ResolvableSdkRegex: null);
                    _generalResolversManifestsRegistry.Add(sdkResolverManifest);
                    _manifestToResolvers[sdkResolverManifest] = resolvers;
                }
                else
                {
                    _resolversList = resolvers;
                }
            }
        }
示例#3
0
        private static SdkResolverManifest ParseSdkResolverElement(XmlReader reader, string filePath)
        {
            SdkResolverManifest manifest = new SdkResolverManifest();

            manifest.DisplayName = filePath;

            reader.Read();
            while (!reader.EOF)
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                {
                    switch (reader.Name)
                    {
                    case "Path":
                        manifest.Path = reader.ReadElementContentAsString();
                        break;

                    case "ResolvableSdkPattern":
                        string pattern = reader.ReadElementContentAsString();
                        try
                        {
                            manifest.ResolvableSdkRegex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.CultureInvariant, TimeSpan.FromMilliseconds(SdkResolverPatternRegexTimeoutMsc));
                        }
                        catch (ArgumentException ex)
                        {
                            ErrorUtilities.ThrowInternalError("A regular expression parsing error occurred while parsing {0}.", ex, filePath);
                        }
                        break;

                    default:
                        throw new XmlException(ResourceUtilities.FormatResourceStringStripCodeAndKeyword("UnrecognizedElement", reader.Name));
                    }
                    break;
                }

                case XmlNodeType.EndElement:
                    reader.Read();
                    break;

                default:
                    throw new XmlException(ResourceUtilities.FormatResourceStringStripCodeAndKeyword("UnrecognizedElement", reader.Name));
                }
            }

            return(manifest);
        }
示例#4
0
        private void RegisterResolversManifests(LoggingContext loggingContext, ElementLocation location)
        {
            lock (_lockObject)
            {
                if (_specificResolversManifestsRegistry != null && _generalResolversManifestsRegistry != null)
                {
                    return;
                }

                MSBuildEventSource.Log.SdkResolverServiceFindResolversManifestsStart();
                var allResolversManifests = _sdkResolverLoader.GetResolversManifests(loggingContext, location);

                _manifestToResolvers = new Dictionary <SdkResolverManifest, IList <SdkResolver> >();

                // Load and add the manifest for the default resolvers, located directly in this dll.
                IList <SdkResolver> defaultResolvers = _sdkResolverLoader.GetDefaultResolvers(loggingContext, location);
                if (defaultResolvers.Count > 0)
                {
                    MSBuildEventSource.Log.SdkResolverServiceLoadResolversStart();
                    SdkResolverManifest sdkDefaultResolversManifest = new SdkResolverManifest(DisplayName: "DefaultResolversManifest", Path: null, ResolvableSdkRegex: null);
                    allResolversManifests.Add(sdkDefaultResolversManifest);
                    _manifestToResolvers[sdkDefaultResolversManifest] = defaultResolvers;
                    MSBuildEventSource.Log.SdkResolverServiceLoadResolversStop(sdkDefaultResolversManifest.DisplayName, defaultResolvers.Count);
                }

                MSBuildEventSource.Log.SdkResolverServiceFindResolversManifestsStop(allResolversManifests.Count);

                // Break the list of all resolvers manifests into two parts: manifests with specific and general resolvers.
                _specificResolversManifestsRegistry = new List <SdkResolverManifest>();
                _generalResolversManifestsRegistry  = new List <SdkResolverManifest>();
                foreach (SdkResolverManifest manifest in allResolversManifests)
                {
                    if (manifest.ResolvableSdkRegex == null)
                    {
                        _generalResolversManifestsRegistry.Add(manifest);
                    }
                    else
                    {
                        _specificResolversManifestsRegistry.Add(manifest);
                    }
                }
            }
        }
示例#5
0
        private bool TryAddAssemblyFromManifest(string pathToManifest, string manifestFolder, List <string> assembliesList, ElementLocation location)
        {
            if (!string.IsNullOrEmpty(pathToManifest) && !FileUtilities.FileExistsNoThrow(pathToManifest))
            {
                return(false);
            }

            string path = null;

            try
            {
                // <SdkResolver>
                //   <Path>...</Path>
                // </SdkResolver>
                var manifest = SdkResolverManifest.Load(pathToManifest);

                if (manifest == null || string.IsNullOrEmpty(manifest.Path))
                {
                    ProjectFileErrorUtilities.ThrowInvalidProjectFile(new BuildEventFileInfo(location), "SdkResolverDllInManifestMissing", pathToManifest, string.Empty);
                }

                path = FileUtilities.FixFilePath(manifest.Path);
            }
            catch (XmlException e)
            {
                // Note: Not logging e.ToString() as most of the information is not useful, the Message will contain what is wrong with the XML file.
                ProjectFileErrorUtilities.ThrowInvalidProjectFile(new BuildEventFileInfo(location), e, "SdkResolverManifestInvalid", pathToManifest, e.Message);
            }

            if (!Path.IsPathRooted(path))
            {
                path = Path.Combine(manifestFolder, path);
                path = Path.GetFullPath(path);
            }

            if (!TryAddAssembly(path, assembliesList))
            {
                ProjectFileErrorUtilities.ThrowInvalidProjectFile(new BuildEventFileInfo(location), "SdkResolverDllInManifestMissing", pathToManifest, path);
            }

            return(true);
        }