/// <summary> /// This method will return a list of parameter values for the custom attribute. /// </summary> /// <remarks> /// Currently, this only works for string values /// </remarks> public static ImmutableArray<string> GetParameterValues(this MetadataReader metadataReader, CustomAttribute customAttribute) { if (customAttribute.Constructor.Kind != HandleKind.MemberReference) { throw new InvalidOperationException(); } var ctor = metadataReader.GetMemberReference((MemberReferenceHandle)customAttribute.Constructor); var provider = new StringParameterValueTypeProvider(metadataReader, customAttribute.Value); var signature = ctor.DecodeMethodSignature(provider); return signature.ParameterTypes; }
public static ImmutableArray <string> GetParameterValues(this CustomAttribute customAttribute, MetadataReader reader) { if (customAttribute.Constructor.Kind != HandleKind.MemberReference) { throw new InvalidOperationException(); } var ctor = reader.GetMemberReference((MemberReferenceHandle)customAttribute.Constructor); var provider = new StringParameterValueTypeProvider(reader, customAttribute.Value); var signature = ctor.DecodeMethodSignature(provider, null); return(signature.ParameterTypes); }
//FIXME: the fallback is broken since multiple frameworks can have the same corlib public TargetFrameworkMoniker GetTargetFrameworkForAssembly(TargetRuntime tr, string file) { if (!File.Exists(file)) { return(TargetFrameworkMoniker.UNKNOWN); } try { using (var reader = new PEReader(File.OpenRead(file))) { var mr = reader.GetMetadataReader(); foreach (var customAttributeHandle in mr.GetAssemblyDefinition().GetCustomAttributes()) { var customAttribute = mr.GetCustomAttribute(customAttributeHandle); var ctorHandle = customAttribute.Constructor; if (ctorHandle.Kind != HandleKind.MemberReference) { continue; } var ctor = mr.GetMemberReference((MemberReferenceHandle)ctorHandle); var attrType = mr.GetTypeReference((TypeReferenceHandle)ctor.Parent); var ns = mr.GetString(attrType.Namespace); if (ns != "System.Runtime.Versioning") { continue; } var typeName = mr.GetString(attrType.Name); if (typeName != "TargetFrameworkAttribute") { continue; } var provider = new StringParameterValueTypeProvider(mr, customAttribute.Value); var signature = ctor.DecodeMethodSignature(provider, null); var parameterTypes = signature.ParameterTypes; if (parameterTypes.Length != 1) { continue; } var value = parameterTypes [0]; if (value != null && TargetFrameworkMoniker.TryParse(value, out var m)) { return(m); } LoggingService.LogError("Invalid TargetFrameworkAttribute in assembly {0} - {1}", file, value); } if (tr != null) { foreach (var assemblyReferenceHandle in mr.AssemblyReferences) { var assemblyReference = mr.GetAssemblyReference(assemblyReferenceHandle); var name = mr.GetString(assemblyReference.Name); if (name != "mscorlib") { continue; } TargetFramework compatibleFramework = null; // If there are several frameworks that can run the file, pick one that is installed foreach (TargetFramework tf in GetKnownFrameworks()) { if (tf.GetCorlibVersion() == assemblyReference.Version.ToString()) { compatibleFramework = tf; if (tr.IsInstalled(tf)) { return(tf.Id); } } } if (compatibleFramework != null) { return(compatibleFramework.Id); } break; } } } } catch (Exception ex) { LoggingService.LogError("Error determining target framework for assembly {0}: {1}", file, ex); } return(TargetFrameworkMoniker.UNKNOWN); }