Exemplo n.º 1
0
        private static bool TryGetTargetFramework(MetadataReader metadata, [NotNullWhen(true)] out string?targetFramework)
        {
            var assembly         = metadata.GetAssemblyDefinition();
            var attributeHandles = assembly.GetCustomAttributes();

            foreach (var attributeHandle in attributeHandles)
            {
                var attribute = metadata.GetCustomAttribute(attributeHandle);
                var(assemblyName, name) = TypeNameGenerator.GetFullName(attribute.Constructor, metadata);
                if (assemblyName == "mscorlib" && name == "System.Runtime.Versioning.TargetFrameworkAttribute..ctor")
                {
                    var decoded = attribute.DecodeValue(TargetFrameworkAttributeDecoder.Default);
                    var frameworkDisplayName = decoded.NamedArguments.SingleOrDefault(arg => arg.Name == "FrameworkDisplayName");
                    if (frameworkDisplayName.Name == "FrameworkDisplayName")
                    {
                        targetFramework = (string)frameworkDisplayName.Value;
                        return(true);
                    }
                }
            }

            targetFramework = null;
            return(false);
        }
Exemplo n.º 2
0
 public string GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind)
 {
     var(_, typeName) = TypeNameGenerator.GetFullName(handle, reader);
     return(typeName);
 }
Exemplo n.º 3
0
 public string GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind)
 {
     var(_, typeName) = TypeNameGenerator.GetFullName(handle, reader);
     return(typeName);
 }
Exemplo n.º 4
0
        internal static UsageInformation FindUsedNuGetApis(MetadataReader metadata)
        {
            var result = new UsageInformation();

            void AddMember(string assembly, string member)
            {
                if (!result.MemberReferences.TryGetValue(assembly, out HashSet <string>?apis))
                {
                    apis = new HashSet <string>();
                    result.MemberReferences[assembly] = apis;
                }

                apis.Add(member);
            }

            foreach (var memberReferenceHandle in metadata.MemberReferences)
            {
                var memberReference        = metadata.GetMemberReference(memberReferenceHandle);
                var foundAssemblyReference = TryFindAssemblyReference(memberReferenceHandle, metadata, out var assemblyReference);

                if (foundAssemblyReference && NuGetAssembly.IsNuGetAssembly(assemblyReference))
                {
                    var assemblyName = assemblyReference.GetAssemblyName();
                    var version      = assemblyName.Version?.ToString();
                    if (version != null)
                    {
                        result.Versions.Add(version);
                    }

                    var kind = memberReference.GetKind();
                    switch (kind)
                    {
                    case MemberReferenceKind.Method:
                    {
                        var(assembly, member) = TypeNameGenerator.GetFullName(memberReferenceHandle, metadata);
                        var sig             = memberReference.DecodeMethodSignature(MethodSignatureDecoder.Default, null);
                        var methodSignature = GetMethodSignature(member, sig);
                        AddMember(assembly, methodSignature);
                    }
                    break;

                    case MemberReferenceKind.Field:
                    {
                        var(assembly, member) = TypeNameGenerator.GetFullName(memberReferenceHandle, metadata);
                        AddMember(assembly, member);
                    }
                    break;

                    default:
                        throw new NotImplementedException(kind.ToString());
                    }
                }
            }

            if (result.MemberReferences.SelectMany(r => r.Value).Any())
            {
                if (TryGetTargetFramework(metadata, out string?targetFramework))
                {
                    result.TargetFrameworks.Add(targetFramework);
                }
            }

            return(result);
        }