Ejemplo n.º 1
0
        internal virtual IList <SdkResolver> LoadResolvers(ILoggingService logger, BuildEventContext buildEventContext,
                                                           ElementLocation location)
        {
            // Always add the default resolver
            var resolvers = new List <SdkResolver> {
                new DefaultSdkResolver()
            };
            var potentialResolvers = FindPotentialSdkResolvers(
                Path.Combine(BuildEnvironmentHelper.Instance.MSBuildToolsDirectory32, "SdkResolvers"));

            if (potentialResolvers.Count == 0)
            {
                return(resolvers);
            }

#if !FEATURE_ASSEMBLY_LOADFROM
            var loader = new CoreClrAssemblyLoader();
#endif

            foreach (var potentialResolver in potentialResolvers)
            {
                try
                {
#if FEATURE_ASSEMBLY_LOADFROM
                    var assembly = Assembly.LoadFrom(potentialResolver);
#else
                    loader.AddDependencyLocation(Path.GetDirectoryName(potentialResolver));
                    Assembly assembly = loader.LoadFromPath(potentialResolver);
#endif

                    resolvers.AddRange(assembly.ExportedTypes
                                       .Select(type => new { type, info = type.GetTypeInfo() })
                                       .Where(t => t.info.IsClass && t.info.IsPublic && typeof(SdkResolver).IsAssignableFrom(t.type))
                                       .Select(t => (SdkResolver)Activator.CreateInstance(t.type)));
                }
                catch (Exception e)
                {
                    logger.LogWarning(buildEventContext, string.Empty, new BuildEventFileInfo(location),
                                      "CouldNotLoadSdkResolver", e.Message);
                }
            }

            return(resolvers.OrderBy(t => t.Priority).ToList());
        }