PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Compilers/Core/Portable/MetadataReader/MetadataReaderExtensions.cs

https://gitlab.com/sharadag/TestProject2
C# | 190 lines | 161 code | 18 blank | 11 comment | 22 complexity | 295eecd94b2867a39b9eba5d4f6e400f MD5 | raw file
  1. // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  2. using System;
  3. using System.Collections.Immutable;
  4. using System.Globalization;
  5. using System.Reflection;
  6. using System.Reflection.Metadata;
  7. namespace Microsoft.CodeAnalysis
  8. {
  9. internal static class MetadataReaderExtensions
  10. {
  11. internal static bool GetWinMdVersion(this MetadataReader reader, out int majorVersion, out int minorVersion)
  12. {
  13. if (reader.MetadataKind == MetadataKind.WindowsMetadata)
  14. {
  15. // Name should be of the form "WindowsRuntime {major}.{minor}".
  16. const string prefix = "WindowsRuntime ";
  17. string version = reader.MetadataVersion;
  18. if (version.StartsWith(prefix, StringComparison.Ordinal))
  19. {
  20. var parts = version.Substring(prefix.Length).Split('.');
  21. if ((parts.Length == 2) &&
  22. int.TryParse(parts[0], NumberStyles.None, CultureInfo.InvariantCulture, out majorVersion) &&
  23. int.TryParse(parts[1], NumberStyles.None, CultureInfo.InvariantCulture, out minorVersion))
  24. {
  25. return true;
  26. }
  27. }
  28. }
  29. majorVersion = 0;
  30. minorVersion = 0;
  31. return false;
  32. }
  33. /// <exception cref="BadImageFormatException">An exception from metadata reader.</exception>
  34. internal static AssemblyIdentity ReadAssemblyIdentityOrThrow(this MetadataReader reader)
  35. {
  36. if (!reader.IsAssembly)
  37. {
  38. return null;
  39. }
  40. var assemblyDef = reader.GetAssemblyDefinition();
  41. return reader.CreateAssemblyIdentityOrThrow(
  42. assemblyDef.Version,
  43. assemblyDef.Flags,
  44. assemblyDef.PublicKey,
  45. assemblyDef.Name,
  46. assemblyDef.Culture,
  47. isReference: false);
  48. }
  49. /// <exception cref="BadImageFormatException">An exception from metadata reader.</exception>
  50. internal static ImmutableArray<AssemblyIdentity> GetReferencedAssembliesOrThrow(this MetadataReader reader)
  51. {
  52. var result = ArrayBuilder<AssemblyIdentity>.GetInstance(reader.AssemblyReferences.Count);
  53. try
  54. {
  55. foreach (var assemblyRef in reader.AssemblyReferences)
  56. {
  57. AssemblyReference reference = reader.GetAssemblyReference(assemblyRef);
  58. result.Add(reader.CreateAssemblyIdentityOrThrow(
  59. reference.Version,
  60. reference.Flags,
  61. reference.PublicKeyOrToken,
  62. reference.Name,
  63. reference.Culture,
  64. isReference: true));
  65. }
  66. return result.ToImmutable();
  67. }
  68. finally
  69. {
  70. result.Free();
  71. }
  72. }
  73. /// <exception cref="BadImageFormatException">An exception from metadata reader.</exception>
  74. internal static Guid GetModuleVersionIdOrThrow(this MetadataReader reader)
  75. {
  76. return reader.GetGuid(reader.GetModuleDefinition().Mvid);
  77. }
  78. /// <exception cref="BadImageFormatException">An exception from metadata reader.</exception>
  79. private static AssemblyIdentity CreateAssemblyIdentityOrThrow(
  80. this MetadataReader reader,
  81. Version version,
  82. AssemblyFlags flags,
  83. BlobHandle publicKey,
  84. StringHandle name,
  85. StringHandle culture,
  86. bool isReference)
  87. {
  88. string nameStr = reader.GetString(name);
  89. if (!MetadataHelpers.IsValidMetadataIdentifier(nameStr))
  90. {
  91. throw new BadImageFormatException(string.Format(CodeAnalysisResources.InvalidAssemblyName, nameStr));
  92. }
  93. string cultureName = culture.IsNil ? null : reader.GetString(culture);
  94. if (cultureName != null && !MetadataHelpers.IsValidMetadataIdentifier(cultureName))
  95. {
  96. throw new BadImageFormatException(string.Format(CodeAnalysisResources.InvalidCultureName, cultureName));
  97. }
  98. ImmutableArray<byte> publicKeyOrToken = reader.GetBlobContent(publicKey);
  99. bool hasPublicKey;
  100. if (isReference)
  101. {
  102. hasPublicKey = (flags & AssemblyFlags.PublicKey) != 0;
  103. if (hasPublicKey)
  104. {
  105. if (!MetadataHelpers.IsValidPublicKey(publicKeyOrToken))
  106. {
  107. throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKey);
  108. }
  109. }
  110. else
  111. {
  112. if (!publicKeyOrToken.IsEmpty &&
  113. publicKeyOrToken.Length != AssemblyIdentity.PublicKeyTokenSize)
  114. {
  115. throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKeyToken);
  116. }
  117. }
  118. }
  119. else
  120. {
  121. // Assembly definitions never contain a public key token, they only can have a full key or nothing,
  122. // so the flag AssemblyFlags.PublicKey does not make sense for them and is ignored.
  123. // See Ecma-335, Partition II Metadata, 22.2 "Assembly : 0x20".
  124. // This also corresponds to the behavior of the native C# compiler and sn.exe tool.
  125. hasPublicKey = !publicKeyOrToken.IsEmpty;
  126. if (hasPublicKey && !MetadataHelpers.IsValidPublicKey(publicKeyOrToken))
  127. {
  128. throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKey);
  129. }
  130. }
  131. if (publicKeyOrToken.IsEmpty)
  132. {
  133. publicKeyOrToken = default(ImmutableArray<byte>);
  134. }
  135. return new AssemblyIdentity(
  136. name: nameStr,
  137. version: version,
  138. cultureName: cultureName,
  139. publicKeyOrToken: publicKeyOrToken,
  140. hasPublicKey: hasPublicKey,
  141. isRetargetable: (flags & AssemblyFlags.Retargetable) != 0,
  142. contentType: (AssemblyContentType)((int)(flags & AssemblyFlags.ContentTypeMask) >> 9),
  143. noThrow: true);
  144. }
  145. internal static bool DeclaresTheObjectClass(this MetadataReader reader)
  146. {
  147. foreach (TypeDefinitionHandle handle in reader.TypeDefinitions)
  148. {
  149. try
  150. {
  151. var typeDef = reader.GetTypeDefinition(handle);
  152. if (typeDef.BaseType.IsNil &&
  153. (typeDef.Attributes & (TypeAttributes.Public | TypeAttributes.Interface)) == TypeAttributes.Public &&
  154. reader.IsSystemObjectOrThrow(typeDef))
  155. {
  156. return true;
  157. }
  158. }
  159. catch (BadImageFormatException)
  160. {
  161. }
  162. }
  163. return false;
  164. }
  165. /// <exception cref="BadImageFormatException">An exception from metadata reader.</exception>
  166. private static bool IsSystemObjectOrThrow(this MetadataReader reader, TypeDefinition typeDef)
  167. {
  168. return reader.StringComparer.Equals(typeDef.Name, "Object") &&
  169. reader.StringComparer.Equals(typeDef.Namespace, "System");
  170. }
  171. }
  172. }