public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory factory)
        {
            PEMemoryBlock resourceDirectory = _module.PEReader.GetSectionData(_module.PEReader.PEHeaders.CorHeader.ResourcesDirectory.RelativeVirtualAddress);

            foreach (var resourceHandle in _module.MetadataReader.ManifestResources)
            {
                ManifestResource resource = _module.MetadataReader.GetManifestResource(resourceHandle);

                // Don't try to process linked resources or resources in other assemblies
                if (!resource.Implementation.IsNil)
                {
                    continue;
                }

                string resourceName = _module.MetadataReader.GetString(resource.Name);
                if (resourceName == "ILLink.Descriptors.xml")
                {
                    BlobReader reader = resourceDirectory.GetReader((int)resource.Offset, resourceDirectory.Length - (int)resource.Offset);
                    int        length = (int)reader.ReadUInt32();

                    UnmanagedMemoryStream ms;
                    unsafe
                    {
                        ms = new UnmanagedMemoryStream(reader.CurrentPointer, length);
                    }

                    var metadataManager = (UsageBasedMetadataManager)factory.MetadataManager;
                    return(DescriptorMarker.GetDependencies(factory, ms, resource, _module, "resource " + resourceName + " in " + _module.ToString(), metadataManager.FeatureSwitches));
                }
            }
            return(Array.Empty <DependencyListEntry>());
        }
Example #2
0
        public static void ProcessDescriptors(AssemblyDefinition assembly, LinkContext context)
        {
            if (context.Annotations.GetAction(assembly) == AssemblyAction.Skip)
            {
                return;
            }

            var rsc = GetEmbeddedXml(assembly, res => ShouldProcessRootDescriptorResource(assembly, context, res.Name));

            if (rsc == null)
            {
                return;
            }

            DescriptorMarker marker = null;

            try {
                context.LogMessage($"Processing embedded linker descriptor {rsc.Name} from {assembly.Name}");
                marker = GetExternalResolveStep(context, rsc, assembly);
            } catch (XmlException ex) {
                /* This could happen if some broken XML file is embedded. */
                context.LogError($"Error processing {rsc.Name}: {ex}", 1003);
            }

            if (marker != null)
            {
                marker.Mark();
            }
        }
 public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory factory)
 {
     using (Stream fs = File.OpenRead(_fileName))
     {
         var metadataManager = (UsageBasedMetadataManager)factory.MetadataManager;
         return(DescriptorMarker.GetDependencies(factory, fs, default, default, _fileName, metadataManager.FeatureSwitches));