Пример #1
0
        void Execute(MetadataResolver resolver)
        {
            foreach (var dir in ReferenceAssembliesDirectory.Split(new char [] { ';' }, StringSplitOptions.RemoveEmptyEntries))
            {
                resolver.AddSearchDirectory(dir);
            }

            var assemblies            = new Dictionary <string, ITaskItem> (Assemblies.Length);
            var topAssemblyReferences = new List <string> (Assemblies.Length);

            try {
                foreach (var assembly in Assemblies)
                {
                    // Add each user assembly and all referenced assemblies (recursive)
                    string resolved_assembly = resolver.Resolve(assembly.ItemSpec);
                    bool   refAssembly       = !string.IsNullOrEmpty(assembly.GetMetadata("NuGetPackageId")) && resolved_assembly.Contains($"{Path.DirectorySeparatorChar}ref{Path.DirectorySeparatorChar}");
                    if (refAssembly || MonoAndroidHelper.IsReferenceAssembly(resolved_assembly))
                    {
                        // Resolve "runtime" library
                        var lockFile = lock_file.Value;
                        if (lockFile != null)
                        {
                            resolved_assembly = ResolveRuntimeAssemblyForReferenceAssembly(lockFile, assembly.ItemSpec);
                        }
                        if (lockFile == null || resolved_assembly == null)
                        {
                            var file = resolved_assembly ?? assembly.ItemSpec;
                            LogCodedWarning("XA0107", file, 0, Properties.Resources.XA0107_Ignoring, file);
                            continue;
                        }
                    }
                    topAssemblyReferences.Add(resolved_assembly);
                    resolver.AddSearchDirectory(Path.GetDirectoryName(resolved_assembly));
                    var taskItem = new TaskItem(assembly)
                    {
                        ItemSpec = Path.GetFullPath(resolved_assembly),
                    };
                    if (string.IsNullOrEmpty(taskItem.GetMetadata("ReferenceAssembly")))
                    {
                        taskItem.SetMetadata("ReferenceAssembly", taskItem.ItemSpec);
                    }
                    string assemblyName = Path.GetFileNameWithoutExtension(resolved_assembly);
                    assemblies [assemblyName] = taskItem;
                }
            } catch (Exception ex) {
                LogCodedError("XA2007", Properties.Resources.XA2007, ex);
                return;
            }
            try {
                foreach (var assembly in topAssemblyReferences)
                {
                    AddAssemblyReferences(resolver, assemblies, assembly, null);
                }
            } catch (Exception ex) {
                LogCodedError("XA2007", Properties.Resources.XA2007, ex);
                return;
            }

            // Add I18N assemblies if needed
            AddI18nAssemblies(resolver, assemblies);

            var mainapiLevel = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion(TargetFrameworkVersion);

            foreach (var item in api_levels.Where(x => mainapiLevel < x.Value))
            {
                var itemOSVersion = MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromApiLevel(item.Value);
                LogCodedWarning("XA0105", ProjectFile, 0, Properties.Resources.XA0105,
                                Path.GetFileName(item.Key), itemOSVersion, TargetFrameworkVersion);
            }

            var resolvedAssemblies          = new List <ITaskItem> (assemblies.Count);
            var resolvedSymbols             = new List <ITaskItem> (assemblies.Count);
            var resolvedFrameworkAssemblies = new List <ITaskItem> (assemblies.Count);
            var resolvedUserAssemblies      = new List <ITaskItem> (assemblies.Count);

            foreach (var assembly in assemblies.Values)
            {
                var mdb = assembly + ".mdb";
                var pdb = Path.ChangeExtension(assembly.ItemSpec, "pdb");
                if (File.Exists(mdb))
                {
                    resolvedSymbols.Add(new TaskItem(mdb));
                }
                if (File.Exists(pdb) && Files.IsPortablePdb(pdb))
                {
                    resolvedSymbols.Add(new TaskItem(pdb));
                }
                resolvedAssemblies.Add(assembly);
                if (MonoAndroidHelper.IsFrameworkAssembly(assembly.ItemSpec, checkSdkPath: true))
                {
                    resolvedFrameworkAssemblies.Add(assembly);
                }
                else
                {
                    resolvedUserAssemblies.Add(assembly);
                }
                assembly.SetDestinationSubPath();
            }
            ResolvedAssemblies             = resolvedAssemblies.ToArray();
            ResolvedSymbols                = resolvedSymbols.ToArray();
            ResolvedFrameworkAssemblies    = resolvedFrameworkAssemblies.ToArray();
            ResolvedUserAssemblies         = resolvedUserAssemblies.ToArray();
            ResolvedDoNotPackageAttributes = do_not_package_atts.ToArray();
        }
        void Execute(MetadataResolver resolver)
        {
            foreach (var dir in ReferenceAssembliesDirectory.Split(new char [] { ';' }, StringSplitOptions.RemoveEmptyEntries))
            {
                resolver.AddSearchDirectory(dir);
            }

            var assemblies            = new Dictionary <string, ITaskItem> (Assemblies.Length);
            var topAssemblyReferences = new List <string> (Assemblies.Length);
            var logger = new NuGetLogger((s) => {
                LogDebugMessage("{0}", s);
            });

            LockFile lockFile = null;

            if (!string.IsNullOrEmpty(ProjectAssetFile) && File.Exists(ProjectAssetFile))
            {
                lockFile = LockFileUtilities.GetLockFile(ProjectAssetFile, logger);
            }

            try {
                foreach (var assembly in Assemblies)
                {
                    // Add each user assembly and all referenced assemblies (recursive)
                    string resolved_assembly = resolver.Resolve(assembly.ItemSpec);
                    if (MonoAndroidHelper.IsReferenceAssembly(resolved_assembly))
                    {
                        // Resolve "runtime" library
                        if (lockFile != null)
                        {
                            resolved_assembly = ResolveRuntimeAssemblyForReferenceAssembly(lockFile, assembly.ItemSpec);
                        }
                        if (lockFile == null || resolved_assembly == null)
                        {
                            LogCodedWarning("XA0107", resolved_assembly, 0, "Ignoring {0} as it is a Reference Assembly", resolved_assembly);
                            continue;
                        }
                    }
                    LogDebugMessage($"Adding {resolved_assembly} to topAssemblyReferences");
                    topAssemblyReferences.Add(resolved_assembly);
                    resolver.AddSearchDirectory(Path.GetDirectoryName(resolved_assembly));
                    var taskItem = new TaskItem(assembly)
                    {
                        ItemSpec = Path.GetFullPath(resolved_assembly),
                    };
                    if (string.IsNullOrEmpty(taskItem.GetMetadata("ReferenceAssembly")))
                    {
                        taskItem.SetMetadata("ReferenceAssembly", taskItem.ItemSpec);
                    }
                    string assemblyName = Path.GetFileNameWithoutExtension(resolved_assembly);
                    assemblies [assemblyName] = taskItem;
                }
            } catch (Exception ex) {
                LogError("Exception while loading assemblies: {0}", ex);
                return;
            }
            try {
                foreach (var assembly in topAssemblyReferences)
                {
                    AddAssemblyReferences(resolver, assemblies, assembly, null);
                }
            } catch (Exception ex) {
                LogError("Exception while loading assemblies: {0}", ex);
                return;
            }

            // Add I18N assemblies if needed
            AddI18nAssemblies(resolver, assemblies);

            var mainapiLevel = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion(TargetFrameworkVersion);

            foreach (var item in api_levels.Where(x => mainapiLevel < x.Value))
            {
                var itemOSVersion = MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromApiLevel(item.Value);
                Log.LogCodedWarning("XA0105", ProjectFile, 0,
                                    "The $(TargetFrameworkVersion) for {0} ({1}) is greater than the $(TargetFrameworkVersion) for your project ({2}). " +
                                    "You need to increase the $(TargetFrameworkVersion) for your project.", Path.GetFileName(item.Key), itemOSVersion, TargetFrameworkVersion);
            }

            var resolvedAssemblies          = new List <ITaskItem> (assemblies.Count);
            var resolvedSymbols             = new List <ITaskItem> (assemblies.Count);
            var resolvedFrameworkAssemblies = new List <ITaskItem> (assemblies.Count);
            var resolvedUserAssemblies      = new List <ITaskItem> (assemblies.Count);

            foreach (var assembly in assemblies.Values)
            {
                var mdb = assembly + ".mdb";
                var pdb = Path.ChangeExtension(assembly.ItemSpec, "pdb");
                if (File.Exists(mdb))
                {
                    resolvedSymbols.Add(new TaskItem(mdb));
                }
                if (File.Exists(pdb) && Files.IsPortablePdb(pdb))
                {
                    resolvedSymbols.Add(new TaskItem(pdb));
                }
                resolvedAssemblies.Add(assembly);
                if (MonoAndroidHelper.IsFrameworkAssembly(assembly.ItemSpec, checkSdkPath: true))
                {
                    resolvedFrameworkAssemblies.Add(assembly);
                }
                else
                {
                    resolvedUserAssemblies.Add(assembly);
                }
            }
            ResolvedAssemblies             = resolvedAssemblies.ToArray();
            ResolvedSymbols                = resolvedSymbols.ToArray();
            ResolvedFrameworkAssemblies    = resolvedFrameworkAssemblies.ToArray();
            ResolvedUserAssemblies         = resolvedUserAssemblies.ToArray();
            ResolvedDoNotPackageAttributes = do_not_package_atts.ToArray();
        }