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); }
public string GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) { var(_, typeName) = TypeNameGenerator.GetFullName(handle, reader); return(typeName); }
public string GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) { var(_, typeName) = TypeNameGenerator.GetFullName(handle, reader); return(typeName); }
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); }