From 4c689bf323fd2606d9ec872e3de946c36d38d340 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 6 May 2024 10:45:01 -0700 Subject: [PATCH 1/2] Switch AOT compilers to use AssemblyNameInfo --- .../General/MetadataReaderExtensions.cs | 11 ++- .../TypeSystem/AssemblyNameInfo.Dummy.cs | 11 +++ .../src/System.Private.TypeLoader.csproj | 1 + .../Compiler/CompilerTypeSystemContext.cs | 2 +- .../Common/Compiler/ProcessLinkerXmlBase.cs | 12 ++-- .../NativeFormatReaderCommonGen.cs | 8 +-- .../Common/TypeSystem/Common/IAssemblyDesc.cs | 4 +- .../TypeSystem/Common/IModuleResolver.cs | 4 +- .../Common/TypeSystemContext.Resolution.cs | 4 +- .../CustomAttributeTypeNameParser.cs | 2 +- .../Common/TypeSystem/Ecma/EcmaAssembly.cs | 21 +++--- .../TypeSystem/Ecma/EcmaModule.Sorting.cs | 6 +- .../Common/TypeSystem/Ecma/EcmaModule.cs | 29 +++----- .../TypeSystemMetadataEmitter.cs | 29 ++++---- .../AccessVerificationHelpers.cs | 43 ++++++------ .../ILVerifyTypeSystemContext.cs | 2 +- src/coreclr/tools/ILVerification/IResolver.cs | 6 +- src/coreclr/tools/ILVerification/Verifier.cs | 2 +- src/coreclr/tools/ILVerify/Program.cs | 10 +-- ...ilerTypeSystemContext.GeneratedAssembly.cs | 6 +- ...DynamicDependencyAttributesOnEntityNode.cs | 4 +- .../ModuleInitializerListNode.cs | 3 +- .../Compiler/MstatObjectDumper.cs | 7 +- .../ILCompiler/Metadata/Transform.Scope.cs | 67 +++++++------------ .../Metadata/Transform.TypeForwarders.cs | 24 +++---- .../ReadyToRun/ManifestMetadataTableNode.cs | 10 +-- .../IBC/MIbcProfileParser.cs | 10 +-- .../TypeSystem/Mutable/MutableModule.cs | 12 ++-- .../TestCasesRunner/TrimmingDriver.cs | 3 +- .../SignatureTests.cs | 7 +- .../TestTypeSystemContext.cs | 3 +- src/coreclr/tools/aot/ILCompiler/Program.cs | 4 +- .../tools/aot/ILCompiler/RdXmlRootProvider.cs | 5 +- src/coreclr/tools/dotnet-pgo/MibcEmitter.cs | 2 +- .../tools/dotnet-pgo/PgoRootCommand.cs | 12 ++-- src/coreclr/tools/dotnet-pgo/Program.cs | 2 +- .../TraceRuntimeDescToTypeSystemDesc.cs | 2 +- .../dotnet-pgo/TraceTypeSystemContext.cs | 2 +- .../TypeRefTypeSystemContext.cs | 6 +- .../TypeRefTypeSystemModule.cs | 8 +-- 40 files changed, 188 insertions(+), 218 deletions(-) create mode 100644 src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/AssemblyNameInfo.Dummy.cs diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/MetadataReaderExtensions.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/MetadataReaderExtensions.cs index 35175e3df6960..3aca021e910cc 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/MetadataReaderExtensions.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/MetadataReaderExtensions.cs @@ -120,13 +120,10 @@ private static RuntimeAssemblyName CreateRuntimeAssemblyNameFromMetadata( ByteCollection publicKeyOrToken, global::Internal.Metadata.NativeFormat.AssemblyFlags assemblyFlags) { - AssemblyNameFlags assemblyNameFlags = AssemblyNameFlags.None; - if (0 != (assemblyFlags & global::Internal.Metadata.NativeFormat.AssemblyFlags.PublicKey)) - assemblyNameFlags |= AssemblyNameFlags.PublicKey; - if (0 != (assemblyFlags & global::Internal.Metadata.NativeFormat.AssemblyFlags.Retargetable)) - assemblyNameFlags |= AssemblyNameFlags.Retargetable; - int contentType = ((int)assemblyFlags) & 0x00000E00; - assemblyNameFlags |= (AssemblyNameFlags)contentType; + AssemblyNameFlags assemblyNameFlags = (AssemblyNameFlags)(assemblyFlags & ( + global::Internal.Metadata.NativeFormat.AssemblyFlags.PublicKey | + global::Internal.Metadata.NativeFormat.AssemblyFlags.Retargetable | + global::Internal.Metadata.NativeFormat.AssemblyFlags.ContentTypeMask)); ArrayBuilder keyOrTokenArrayBuilder = default; foreach (byte b in publicKeyOrToken) diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/AssemblyNameInfo.Dummy.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/AssemblyNameInfo.Dummy.cs new file mode 100644 index 0000000000000..51d07ba6a15ad --- /dev/null +++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/AssemblyNameInfo.Dummy.cs @@ -0,0 +1,11 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Internal.TypeSystem +{ + // Dummy implementation of AssemlyNameInfo for runtime type system + public abstract class AssemblyNameInfo + { + public abstract string FullName { get; } + } +} diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj b/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj index cc094a354e08f..14eda37aa48e7 100644 --- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj +++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj @@ -255,6 +255,7 @@ + diff --git a/src/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.cs b/src/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.cs index e708130f6fc36..8ecd0fb034d22 100644 --- a/src/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.cs +++ b/src/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.cs @@ -98,7 +98,7 @@ public IReadOnlyDictionary ReferenceFilePaths set; } - public override ModuleDesc ResolveAssembly(System.Reflection.AssemblyName name, bool throwIfNotFound) + public override ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound) { // TODO: catch typesystem BadImageFormatException and throw a new one that also captures the // assembly name that caused the failure. (Along with the reason, which makes this rather annoying). diff --git a/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs b/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs index ba6b1f0694d04..9bcc484b178a3 100644 --- a/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs +++ b/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs @@ -128,7 +128,7 @@ protected virtual void ProcessXml(bool ignoreResource) protected virtual AllowedAssemblies AllowedAssemblySelector { get => _owningModule != null ? AllowedAssemblies.ContainingAssembly : AllowedAssemblies.AnyAssembly; } - private bool ShouldProcessAllAssemblies(XPathNavigator nav, [NotNullWhen(false)] out AssemblyName? assemblyName) + private bool ShouldProcessAllAssemblies(XPathNavigator nav, [NotNullWhen(false)] out AssemblyNameInfo? assemblyName) { assemblyName = null; if (GetFullName(nav) == AllAssembliesFullName) @@ -147,7 +147,7 @@ protected virtual void ProcessAssemblies(XPathNavigator nav) // Errors for invalid assembly names should show up even if this element will be // skipped due to feature conditions. - bool processAllAssemblies = ShouldProcessAllAssemblies(assemblyNav, out AssemblyName? name); + bool processAllAssemblies = ShouldProcessAllAssemblies(assemblyNav, out AssemblyNameInfo? name); if (processAllAssemblies && !_globalAttributeRemoval) { #if !READYTORUN @@ -175,7 +175,7 @@ protected virtual void ProcessAssemblies(XPathNavigator nav) if (_owningModule.Assembly.GetName().Name != name!.Name) { #if !READYTORUN - LogWarning(assemblyNav, DiagnosticId.AssemblyWithEmbeddedXmlApplyToAnotherAssembly, _owningModule.Assembly.GetName().Name ?? "", name.ToString()); + LogWarning(assemblyNav, DiagnosticId.AssemblyWithEmbeddedXmlApplyToAnotherAssembly, _owningModule.Assembly.GetName().Name, name.FullName); #endif continue; } @@ -188,7 +188,7 @@ protected virtual void ProcessAssemblies(XPathNavigator nav) if (assembly == null) { #if !READYTORUN - LogWarning(assemblyNav, DiagnosticId.XmlCouldNotResolveAssembly, name!.Name ?? ""); + LogWarning(assemblyNav, DiagnosticId.XmlCouldNotResolveAssembly, name!.Name); #endif continue; } @@ -499,9 +499,9 @@ protected virtual void ProcessProperty(TypeDesc type, XPathNavigator nav, object protected virtual void ProcessProperty(TypeDesc type, PropertyPseudoDesc property, XPathNavigator nav, object? customData, bool fromSignature) { } - protected virtual AssemblyName GetAssemblyName(XPathNavigator nav) + protected virtual AssemblyNameInfo GetAssemblyName(XPathNavigator nav) { - return new AssemblyName(GetFullName(nav)); + return AssemblyNameInfo.Parse(GetFullName(nav)); } protected static string GetFullName(XPathNavigator nav) diff --git a/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeFormatReaderCommonGen.cs b/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeFormatReaderCommonGen.cs index a9359f373de57..5e25a08278645 100644 --- a/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeFormatReaderCommonGen.cs +++ b/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeFormatReaderCommonGen.cs @@ -14,6 +14,7 @@ namespace Internal.Metadata.NativeFormat { + // Internal clone of System.Reflection.AssemblyFlags from System.Reflection.Metadata [Flags] #if SYSTEM_PRIVATE_CORELIB [CLSCompliant(false)] @@ -26,13 +27,12 @@ public enum AssemblyFlags : uint /// The implementation of this assembly used at runtime is not expected to match the version seen at compile time. Retargetable = 0x100, - /// Reserved. - DisableJITcompileOptimizer = 0x4000, + /// Content type mask. Masked bits correspond to values of System.Reflection.AssemblyContentType + ContentTypeMask = 0x00000e00, - /// Reserved. - EnableJITcompileTracking = 0x8000, } // AssemblyFlags + // Internal clone of System.Reflection.AssemblyHashAlgorithm from System.Reflection.Metadata #if SYSTEM_PRIVATE_CORELIB [CLSCompliant(false)] #endif diff --git a/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs index be0f346f391d9..c64e7e3808651 100644 --- a/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs +++ b/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs @@ -1,7 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Reflection; +using System.Reflection.Metadata; namespace Internal.TypeSystem { @@ -13,6 +13,6 @@ public interface IAssemblyDesc /// /// Gets the assembly name. /// - AssemblyName GetName(); + AssemblyNameInfo GetName(); } } diff --git a/src/coreclr/tools/Common/TypeSystem/Common/IModuleResolver.cs b/src/coreclr/tools/Common/TypeSystem/Common/IModuleResolver.cs index 0acc7ee8b9e12..391cd6f066bdf 100644 --- a/src/coreclr/tools/Common/TypeSystem/Common/IModuleResolver.cs +++ b/src/coreclr/tools/Common/TypeSystem/Common/IModuleResolver.cs @@ -1,13 +1,13 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Reflection; +using System.Reflection.Metadata; namespace Internal.TypeSystem { public interface IModuleResolver { - ModuleDesc ResolveAssembly(AssemblyName name, bool throwIfNotFound = true); + ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound = true); ModuleDesc ResolveModule(IAssemblyDesc referencingModule, string fileName, bool throwIfNotFound = true); } } diff --git a/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.Resolution.cs b/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.Resolution.cs index 806bf66e94e25..1e475ed7e1b2e 100644 --- a/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.Resolution.cs +++ b/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.Resolution.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Reflection; +using System.Reflection.Metadata; using Internal.NativeFormat; @@ -24,7 +24,7 @@ protected void InitializeSystemModule(ModuleDesc systemModule) SystemModule = systemModule; } - public virtual ModuleDesc ResolveAssembly(AssemblyName name, bool throwIfNotFound = true) + public virtual ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound = true) { if (throwIfNotFound) throw new NotSupportedException(); diff --git a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs index cda882d7b730f..7f19644ad10d9 100644 --- a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs +++ b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs @@ -109,7 +109,7 @@ private TypeDesc GetSimpleType(TypeName typeName) ModuleDesc module = _module; if (topLevelTypeName.AssemblyName != null) { - module = _context.ResolveAssembly(typeName.AssemblyName.ToAssemblyName(), throwIfNotFound: _throwIfNotFound); + module = _context.ResolveAssembly(typeName.AssemblyName, throwIfNotFound: _throwIfNotFound); if (module == null) return null; } diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs index 5a281d21ba11a..c59d2b5fee555 100644 --- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs +++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs @@ -9,7 +9,7 @@ namespace Internal.TypeSystem.Ecma { public sealed partial class EcmaAssembly : EcmaModule, IAssemblyDesc { - private AssemblyName _assemblyName; + private AssemblyNameInfo _assemblyName; private AssemblyDefinition _assemblyDefinition; public AssemblyDefinition AssemblyDefinition @@ -39,20 +39,21 @@ public EcmaAssembly(TypeSystemContext context, PEReader peReader, MetadataReader _assemblyDefinition = metadataReader.GetAssemblyDefinition(); } - // Returns cached copy of the name. Caller has to create a clone before mutating the name. - public AssemblyName GetName() + public AssemblyNameInfo GetName() { if (_assemblyName == null) { MetadataReader metadataReader = this.MetadataReader; - AssemblyName an = new AssemblyName(); - an.Name = metadataReader.GetString(_assemblyDefinition.Name); - an.Version = _assemblyDefinition.Version; - an.SetPublicKey(metadataReader.GetBlobBytes(_assemblyDefinition.PublicKey)); - - an.CultureName = metadataReader.GetString(_assemblyDefinition.Culture); - an.ContentType = GetContentTypeFromAssemblyFlags(_assemblyDefinition.Flags); + AssemblyNameInfo an = new AssemblyNameInfo + ( + name: metadataReader.GetString(_assemblyDefinition.Name), + version: _assemblyDefinition.Version, + cultureName: metadataReader.GetString(_assemblyDefinition.Culture), + flags: (AssemblyNameFlags) + ((_assemblyDefinition.Flags & AssemblyFlags.ContentTypeMask) | AssemblyFlags.PublicKey), + publicKeyOrToken: metadataReader.GetBlobContent(_assemblyDefinition.PublicKey) + ); _assemblyName = an; } diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.Sorting.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.Sorting.cs index ec4e9709459df..8b189245e27c1 100644 --- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.Sorting.cs +++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.Sorting.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Reflection; +using System.Reflection.Metadata; using Debug = System.Diagnostics.Debug; @@ -20,8 +20,8 @@ public int CompareTo(EcmaModule other) if (thisAssembly != otherAssembly) { // Each module comes from a different assembly: compare the assemblies - AssemblyName thisAssemblyName = thisAssembly.GetName(); - AssemblyName otherAssemblyName = otherAssembly.GetName(); + AssemblyNameInfo thisAssemblyName = thisAssembly.GetName(); + AssemblyNameInfo otherAssemblyName = otherAssembly.GetName(); int compare = StringComparer.Ordinal.Compare(thisAssemblyName.Name, otherAssemblyName.Name); if (compare != 0) diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs index 1da6806aea423..6758f4a549866 100644 --- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs +++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs @@ -615,22 +615,14 @@ private object ResolveAssemblyReference(AssemblyReferenceHandle handle) { AssemblyReference assemblyReference = _metadataReader.GetAssemblyReference(handle); - AssemblyName an = new AssemblyName(); - an.Name = _metadataReader.GetString(assemblyReference.Name); - an.Version = assemblyReference.Version; - - var publicKeyOrToken = _metadataReader.GetBlobBytes(assemblyReference.PublicKeyOrToken); - if ((assemblyReference.Flags & AssemblyFlags.PublicKey) != 0) - { - an.SetPublicKey(publicKeyOrToken); - } - else - { - an.SetPublicKeyToken(publicKeyOrToken); - } - - an.CultureName = _metadataReader.GetString(assemblyReference.Culture); - an.ContentType = GetContentTypeFromAssemblyFlags(assemblyReference.Flags); + AssemblyNameInfo an = new AssemblyNameInfo + ( + name: _metadataReader.GetString(assemblyReference.Name), + version: assemblyReference.Version, + cultureName: _metadataReader.GetString(assemblyReference.Culture), + flags: (AssemblyNameFlags)assemblyReference.Flags, + publicKeyOrToken: _metadataReader.GetBlobContent(assemblyReference.PublicKeyOrToken) + ); var assembly = _moduleResolver.ResolveAssembly(an, throwIfNotFound: false); if (assembly == null) @@ -687,11 +679,6 @@ public sealed override MetadataType GetGlobalModuleType() return (MetadataType)GetType(MetadataTokens.EntityHandle(0x02000001 /* COR_GLOBAL_PARENT_TOKEN */)); } - protected static AssemblyContentType GetContentTypeFromAssemblyFlags(AssemblyFlags flags) - { - return (AssemblyContentType)(((int)flags & 0x0E00) >> 9); - } - public string GetUserString(UserStringHandle userStringHandle) { // String literals are not cached diff --git a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs index 395c1045e2fef..9afbca2c7aaf1 100644 --- a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs +++ b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs @@ -9,6 +9,7 @@ using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; using System.Reflection.PortableExecutable; +using System.Runtime.InteropServices; namespace Internal.TypeSystem { @@ -28,7 +29,7 @@ internal class TypeSystemMetadataEmitter private BlobHandle _noArgsVoidReturnStaticMethodSigHandle; protected TypeSystemContext _typeSystemContext; - public TypeSystemMetadataEmitter(AssemblyName assemblyName, TypeSystemContext context, AssemblyFlags flags = default(AssemblyFlags), byte[] publicKeyArray = null) + public TypeSystemMetadataEmitter(AssemblyNameInfo assemblyName, TypeSystemContext context, AssemblyFlags flags = default(AssemblyFlags), byte[] publicKeyArray = null) { _typeSystemContext = context; _metadataBuilder = new MetadataBuilder(); @@ -118,26 +119,26 @@ public byte[] EmitToMetadataBlob() return metadataBlobBuilder.ToArray(); } - public AssemblyReferenceHandle GetAssemblyRef(AssemblyName name) + public AssemblyReferenceHandle GetAssemblyRef(AssemblyNameInfo name) { if (!_assemblyRefNameHandles.TryGetValue(name.FullName, out var handle)) { StringHandle assemblyName = _metadataBuilder.GetOrAddString(name.Name); StringHandle cultureName = (name.CultureName != null) ? _metadataBuilder.GetOrAddString(name.CultureName) : default(StringHandle); - BlobHandle publicTokenBlob = name.GetPublicKeyToken() != null ? _metadataBuilder.GetOrAddBlob(name.GetPublicKeyToken()) : default(BlobHandle); - AssemblyFlags flags = default(AssemblyFlags); - if (name.Flags.HasFlag(AssemblyNameFlags.Retargetable)) - { - flags |= AssemblyFlags.Retargetable; - } - if (name.ContentType == AssemblyContentType.WindowsRuntime) + + ImmutableArray publicKeyOrToken = name.PublicKeyOrToken; + if ((name.Flags & AssemblyNameFlags.PublicKey) != 0) { - flags |= AssemblyFlags.WindowsRuntime; + // Use AssemblyName to convert PublicKey to PublicKeyToken to avoid calling crypto APIs directly + AssemblyName an = new(); + an.SetPublicKey(ImmutableCollectionsMarshal.AsArray(publicKeyOrToken)); + publicKeyOrToken = ImmutableCollectionsMarshal.AsImmutableArray(an.GetPublicKeyToken()); } + BlobHandle publicTokenBlob = publicKeyOrToken.IsDefault ? default : _metadataBuilder.GetOrAddBlob(publicKeyOrToken); + + AssemblyFlags flags = (AssemblyFlags)name.Flags & (AssemblyFlags.Retargetable | AssemblyFlags.ContentTypeMask); - Version version = name.Version; - if (version == null) - version = new Version(0, 0); + Version version = name.Version ?? new Version(0, 0); handle = _metadataBuilder.AddAssemblyReference(assemblyName, version, cultureName, publicTokenBlob, flags, default(BlobHandle)); @@ -152,7 +153,7 @@ public AssemblyReferenceHandle GetAssemblyRef(IAssemblyDesc assemblyDesc) { return handle; } - AssemblyName name = assemblyDesc.GetName(); + AssemblyNameInfo name = assemblyDesc.GetName(); var referenceHandle = GetAssemblyRef(name); _assemblyRefs.Add(assemblyDesc, referenceHandle); return referenceHandle; diff --git a/src/coreclr/tools/ILVerification/AccessVerificationHelpers.cs b/src/coreclr/tools/ILVerification/AccessVerificationHelpers.cs index ef694cbc8251a..81cc18f0c7780 100644 --- a/src/coreclr/tools/ILVerification/AccessVerificationHelpers.cs +++ b/src/coreclr/tools/ILVerification/AccessVerificationHelpers.cs @@ -2,8 +2,13 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Collections.Immutable; using System.Diagnostics; +using System.Linq; using System.Reflection; +using System.Reflection.Metadata; +using System.Runtime.InteropServices; + using Internal.TypeSystem; using Internal.TypeSystem.Ecma; @@ -244,37 +249,31 @@ private static bool GrantsFriendAccessTo(this ModuleDesc module, ModuleDesc frie foreach (var attribute in assembly.GetDecodedCustomAttributes("System.Runtime.CompilerServices", "InternalsVisibleToAttribute")) { - AssemblyName friendAttributeName = new AssemblyName((string)attribute.FixedArguments[0].Value); + AssemblyNameInfo friendAttributeName = AssemblyNameInfo.Parse(((string)attribute.FixedArguments[0].Value).AsSpan()); if (!friendName.Name.Equals(friendAttributeName.Name, StringComparison.OrdinalIgnoreCase)) continue; - // Comparing PublicKeyToken, since GetPublicKey returns null due to a bug - if (IsSamePublicKey(friendAttributeName.GetPublicKeyToken(), friendName.GetPublicKeyToken())) + // Comparing PublicKeyToken for simplicity + if (GetPublicKeyToken(friendAttributeName).SequenceEqual(GetPublicKeyToken(friendName))) return true; + + static ReadOnlySpan GetPublicKeyToken(AssemblyNameInfo assemblyName) + { + ImmutableArray publicKeyOrToken = assemblyName.PublicKeyOrToken; + if ((assemblyName.Flags & AssemblyNameFlags.PublicKey) != 0) + { + // Use AssemblyName to convert PublicKey to PublicKeyToken to avoid calling crypto APIs directly + AssemblyName an = new(); + an.SetPublicKey(ImmutableCollectionsMarshal.AsArray(publicKeyOrToken)); + publicKeyOrToken = ImmutableCollectionsMarshal.AsImmutableArray(an.GetPublicKeyToken()); + } + return publicKeyOrToken.AsSpan(); + } } } return false; } - private static bool IsSamePublicKey(byte[] key1, byte[] key2) - { - if (key1 == null) - return key2 == null || key2.Length == 0; - if (key2 == null) - return key1 == null || key1.Length == 0; - - if (key1.Length != key2.Length) - return false; - - for (int i = 0; i < key1.Length; ++i) - { - if (key1[i] != key2[i]) - return false; - } - - return true; - } - private static MethodAttributes NestedToMethodAccessAttribute(TypeAttributes nestedVisibility) { switch (nestedVisibility & TypeAttributes.VisibilityMask) diff --git a/src/coreclr/tools/ILVerification/ILVerifyTypeSystemContext.cs b/src/coreclr/tools/ILVerification/ILVerifyTypeSystemContext.cs index 52d6d43edb7c3..05a4a3bbc5590 100644 --- a/src/coreclr/tools/ILVerification/ILVerifyTypeSystemContext.cs +++ b/src/coreclr/tools/ILVerification/ILVerifyTypeSystemContext.cs @@ -28,7 +28,7 @@ public ILVerifyTypeSystemContext(IResolver resolver) _resolver = resolver; } - public override ModuleDesc ResolveAssembly(AssemblyName name, bool throwIfNotFound = true) + public override ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound = true) { return CacheResolvedAssemblyOrNetmodule(_resolver.ResolveAssembly(name), name.Name, null, throwIfNotFound); } diff --git a/src/coreclr/tools/ILVerification/IResolver.cs b/src/coreclr/tools/ILVerification/IResolver.cs index 1fd03d02756cc..751aad4c05ae6 100644 --- a/src/coreclr/tools/ILVerification/IResolver.cs +++ b/src/coreclr/tools/ILVerification/IResolver.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using System.Reflection; +using System.Reflection.Metadata; using System.Reflection.PortableExecutable; namespace ILVerify @@ -12,11 +12,11 @@ public interface IResolver /// /// Resolve assembly to PEReader. This method should return the same instance when queried multiple times. /// - PEReader ResolveAssembly(AssemblyName assemblyName); + PEReader ResolveAssembly(AssemblyNameInfo assemblyName); /// /// Resolve module to PEReader. This method should return the same instance when queried multiple times. /// - PEReader ResolveModule(AssemblyName referencingAssembly, string fileName); + PEReader ResolveModule(AssemblyNameInfo referencingAssembly, string fileName); } } diff --git a/src/coreclr/tools/ILVerification/Verifier.cs b/src/coreclr/tools/ILVerification/Verifier.cs index 46610485d2dad..5283521515ad1 100644 --- a/src/coreclr/tools/ILVerification/Verifier.cs +++ b/src/coreclr/tools/ILVerification/Verifier.cs @@ -34,7 +34,7 @@ internal Verifier(ILVerifyTypeSystemContext context, VerifierOptions verifierOpt _verifierOptions = verifierOptions ?? new VerifierOptions(); } - public void SetSystemModuleName(AssemblyName name) + public void SetSystemModuleName(AssemblyNameInfo name) { PEReader peReader = _typeSystemContext._resolver.ResolveAssembly(name); if (peReader is null) diff --git a/src/coreclr/tools/ILVerify/Program.cs b/src/coreclr/tools/ILVerify/Program.cs index 908de5b701f35..88da48f50fb04 100644 --- a/src/coreclr/tools/ILVerify/Program.cs +++ b/src/coreclr/tools/ILVerify/Program.cs @@ -113,13 +113,13 @@ public int Run() IncludeMetadataTokensInErrorMessages = Get(_command.Tokens), SanityChecks = Get(_command.SanityChecks) }); - _verifier.SetSystemModuleName(new AssemblyName(Get(_command.SystemModule) ?? "mscorlib")); + _verifier.SetSystemModuleName(new AssemblyNameInfo(Get(_command.SystemModule) ?? "mscorlib")); int numErrors = 0; foreach (var kvp in _inputFilePaths) { - numErrors += VerifyAssembly(new AssemblyName(kvp.Key), kvp.Value); + numErrors += VerifyAssembly(new AssemblyNameInfo(kvp.Key), kvp.Value); } if (numErrors > 0) @@ -224,7 +224,7 @@ private static void PrintMethod(EcmaMethod method) Write(")"); } - private int VerifyAssembly(AssemblyName name, string path) + private int VerifyAssembly(AssemblyNameInfo name, string path) { PEReader peReader = Resolve(name.Name); EcmaModule module = _verifier.GetModule(peReader); @@ -451,10 +451,10 @@ private bool ShouldIgnoreVerificationResult(VerificationResult result) return false; } - PEReader IResolver.ResolveAssembly(AssemblyName assemblyName) + PEReader IResolver.ResolveAssembly(AssemblyNameInfo assemblyName) => Resolve(assemblyName.Name); - PEReader IResolver.ResolveModule(AssemblyName referencingModule, string fileName) + PEReader IResolver.ResolveModule(AssemblyNameInfo referencingModule, string fileName) => Resolve(Path.GetFileNameWithoutExtension(fileName)); public PEReader Resolve(string simpleName) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/CompilerTypeSystemContext.GeneratedAssembly.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/CompilerTypeSystemContext.GeneratedAssembly.cs index aa2da8a6cd17b..fc22998586263 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/CompilerTypeSystemContext.GeneratedAssembly.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/CompilerTypeSystemContext.GeneratedAssembly.cs @@ -3,12 +3,12 @@ using System; using System.Collections.Generic; +using System.Reflection.Metadata; using Internal.TypeSystem; using TypeHashingAlgorithms = Internal.NativeFormat.TypeHashingAlgorithms; using Interlocked = System.Threading.Interlocked; -using AssemblyName = System.Reflection.AssemblyName; using Debug = System.Diagnostics.Debug; namespace ILCompiler @@ -52,9 +52,9 @@ public override MetadataType GetGlobalModuleType() return _globalModuleType; } - public AssemblyName GetName() + public AssemblyNameInfo GetName() { - return new AssemblyName("System.Private.CompilerGenerated"); + return new AssemblyNameInfo("System.Private.CompilerGenerated"); } public override object GetType(string nameSpace, string name, NotFoundBehavior notFoundBehavior) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DynamicDependencyAttributesOnEntityNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DynamicDependencyAttributesOnEntityNode.cs index 7c07dfd53eb60..31b54535294a9 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DynamicDependencyAttributesOnEntityNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DynamicDependencyAttributesOnEntityNode.cs @@ -122,7 +122,7 @@ static MetadataType Linkerify(TypeDesc type) // DynamicDependencyAttribute(String, String, String) case 3 when fixedArgs[1].Value is string typeStringFromAttribute && fixedArgs[2].Value is string assemblyStringFromAttribute: - ModuleDesc asm = factory.TypeSystemContext.ResolveAssembly(new System.Reflection.AssemblyName(assemblyStringFromAttribute), throwIfNotFound: false); + ModuleDesc asm = factory.TypeSystemContext.ResolveAssembly(AssemblyNameInfo.Parse(assemblyStringFromAttribute), throwIfNotFound: false); if (asm == null) { metadataManager.Logger.LogWarning( @@ -171,7 +171,7 @@ static MetadataType Linkerify(TypeDesc type) && fixedArgs[2].Value is string assemblyStringFromAttribute) { // DynamicDependencyAttribute(DynamicallyAccessedMemberTypes, String, String) - ModuleDesc asm = factory.TypeSystemContext.ResolveAssembly(new System.Reflection.AssemblyName(assemblyStringFromAttribute), throwIfNotFound: false); + ModuleDesc asm = factory.TypeSystemContext.ResolveAssembly(AssemblyNameInfo.Parse(assemblyStringFromAttribute), throwIfNotFound: false); if (asm == null) { metadataManager.Logger.LogWarning( diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ModuleInitializerListNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ModuleInitializerListNode.cs index c85f1494437ab..31f4ecaa871f8 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ModuleInitializerListNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ModuleInitializerListNode.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Reflection.Metadata; using Internal.Text; using Internal.TypeSystem; @@ -203,7 +204,7 @@ public ModuleGraphNode GetNode(ModuleDesc module) try { - var reference = module.Context.ResolveAssembly(new System.Reflection.AssemblyName(assemblyName)); + var reference = module.Context.ResolveAssembly(new AssemblyNameInfo(assemblyName)); referencedAssemblies.Add(reference); } catch (TypeSystemException) { } diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MstatObjectDumper.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MstatObjectDumper.cs index 6217fad3c8c44..341be9932824b 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MstatObjectDumper.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MstatObjectDumper.cs @@ -19,7 +19,6 @@ using Debug = System.Diagnostics.Debug; using ObjectData = ILCompiler.DependencyAnalysis.ObjectNode.ObjectData; -using AssemblyName = System.Reflection.AssemblyName; namespace ILCompiler { @@ -45,8 +44,8 @@ public class MstatObjectDumper : ObjectDumper public MstatObjectDumper(string fileName, TypeSystemContext context) { _fileName = fileName; - var asmName = new AssemblyName(Path.GetFileName(fileName)); - asmName.Version = new Version(VersionMajor, VersionMinor); + var asmName = new AssemblyNameInfo(Path.GetFileName(fileName), + version: new Version(VersionMajor, VersionMinor)); _emitter = new MstatEmitter(asmName, context); _emitter.AllowUseOfAddGlobalMethod(); } @@ -186,7 +185,7 @@ private sealed class MstatEmitter : TypeSystemMetadataEmitter { private readonly List<(string Name, BlobBuilder Content)> _customSections = new(); - public MstatEmitter(AssemblyName assemblyName, TypeSystemContext context, AssemblyFlags flags = default(AssemblyFlags), byte[] publicKeyArray = null) + public MstatEmitter(AssemblyNameInfo assemblyName, TypeSystemContext context, AssemblyFlags flags = default(AssemblyFlags), byte[] publicKeyArray = null) : base(assemblyName, context, flags, publicKeyArray) { } diff --git a/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Scope.cs b/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Scope.cs index e651322d0f855..d6584f63decbb 100644 --- a/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Scope.cs +++ b/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.Scope.cs @@ -3,6 +3,10 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; using Internal.Metadata.NativeFormat.Writer; using Cts = Internal.TypeSystem; @@ -10,9 +14,7 @@ using Debug = System.Diagnostics.Debug; using AssemblyFlags = Internal.Metadata.NativeFormat.AssemblyFlags; -using AssemblyNameFlags = System.Reflection.AssemblyNameFlags; -using AssemblyContentType = System.Reflection.AssemblyContentType; -using AssemblyName = System.Reflection.AssemblyName; +using AssemblyNameInfo = System.Reflection.Metadata.AssemblyNameInfo; namespace ILCompiler.Metadata { @@ -35,35 +37,13 @@ private void InitializeScopeDefinition(Cts.ModuleDesc module, ScopeDefinition sc var assemblyName = assemblyDesc.GetName(); scopeDefinition.Name = HandleString(assemblyName.Name); -#if NETFX_45 - // With NET 4.5 contract System.Reflection 4.0.0.0 EcmaModule has no way - // to set Culture in its AssemblyName. - scopeDefinition.Culture = HandleString(assemblyName.CultureName ?? ""); -#else scopeDefinition.Culture = HandleString(assemblyName.CultureName); -#endif scopeDefinition.MajorVersion = checked((ushort)assemblyName.Version.Major); scopeDefinition.MinorVersion = checked((ushort)assemblyName.Version.Minor); scopeDefinition.BuildNumber = checked((ushort)assemblyName.Version.Build); scopeDefinition.RevisionNumber = checked((ushort)assemblyName.Version.Revision); - - Debug.Assert((int)AssemblyFlags.PublicKey == (int)AssemblyNameFlags.PublicKey); - Debug.Assert((int)AssemblyFlags.Retargetable == (int)AssemblyNameFlags.Retargetable); scopeDefinition.Flags = (AssemblyFlags)assemblyName.Flags; - - if (assemblyName.ContentType == AssemblyContentType.WindowsRuntime) - { - scopeDefinition.Flags |= (AssemblyFlags)((int)AssemblyContentType.WindowsRuntime << 9); - } - - if ((scopeDefinition.Flags & AssemblyFlags.PublicKey) != 0) - { - scopeDefinition.PublicKey = assemblyName.GetPublicKey(); - } - else - { - scopeDefinition.PublicKey = assemblyName.GetPublicKeyToken(); - } + scopeDefinition.PublicKey = assemblyName.PublicKeyOrToken.ToArray(); Cts.MetadataType moduleType = module.GetGlobalModuleType(); if (moduleType != null && _policy.GeneratesMetadata(moduleType)) @@ -107,9 +87,9 @@ private void InitializeScopeDefinition(Cts.ModuleDesc module, ScopeDefinition sc } } - private EntityMap _scopeRefs - = new EntityMap(new SimpleAssemblyNameComparer()); - private Action _initScopeRef; + private EntityMap _scopeRefs + = new EntityMap(new SimpleAssemblyNameComparer()); + private Action _initScopeRef; private ScopeReference HandleScopeReference(Cts.ModuleDesc module) { @@ -120,12 +100,12 @@ private ScopeReference HandleScopeReference(Cts.ModuleDesc module) throw new NotSupportedException("Multi-module assemblies"); } - private ScopeReference HandleScopeReference(AssemblyName assemblyName) + private ScopeReference HandleScopeReference(AssemblyNameInfo assemblyName) { return _scopeRefs.GetOrCreate(assemblyName, _initScopeRef ??= InitializeScopeReference); } - private void InitializeScopeReference(AssemblyName assemblyName, ScopeReference scopeReference) + private void InitializeScopeReference(AssemblyNameInfo assemblyName, ScopeReference scopeReference) { scopeReference.Name = HandleString(assemblyName.Name); scopeReference.Culture = HandleString(assemblyName.CultureName); @@ -133,31 +113,30 @@ private void InitializeScopeReference(AssemblyName assemblyName, ScopeReference scopeReference.MinorVersion = checked((ushort)assemblyName.Version.Minor); scopeReference.BuildNumber = checked((ushort)assemblyName.Version.Build); scopeReference.RevisionNumber = checked((ushort)assemblyName.Version.Revision); - - Debug.Assert((int)AssemblyFlags.PublicKey == (int)AssemblyNameFlags.PublicKey); - Debug.Assert((int)AssemblyFlags.Retargetable == (int)AssemblyNameFlags.Retargetable); + scopeReference.Flags = (AssemblyFlags)assemblyName.Flags & (AssemblyFlags.Retargetable | AssemblyFlags.ContentTypeMask); // References use a public key token instead of full public key. - scopeReference.Flags = (AssemblyFlags)(assemblyName.Flags & ~AssemblyNameFlags.PublicKey); - - if (assemblyName.ContentType == AssemblyContentType.WindowsRuntime) + ImmutableArray publicKeyOrToken = assemblyName.PublicKeyOrToken; + if ((assemblyName.Flags & AssemblyNameFlags.PublicKey) != 0) { - scopeReference.Flags |= (AssemblyFlags)((int)AssemblyContentType.WindowsRuntime << 9); + // Use AssemblyName to convert PublicKey to PublicKeyToken to avoid calling crypto APIs directly + AssemblyName an = new(); + an.SetPublicKey(ImmutableCollectionsMarshal.AsArray(publicKeyOrToken)); + publicKeyOrToken = ImmutableCollectionsMarshal.AsImmutableArray(an.GetPublicKeyToken()); } - - scopeReference.PublicKeyOrToken = assemblyName.GetPublicKeyToken(); + scopeReference.PublicKeyOrToken = publicKeyOrToken.ToArray(); } - private sealed class SimpleAssemblyNameComparer : IEqualityComparer + private sealed class SimpleAssemblyNameComparer : IEqualityComparer { - public bool Equals(AssemblyName x, AssemblyName y) + public bool Equals(AssemblyNameInfo x, AssemblyNameInfo y) { return Equals(x.Name, y.Name); } - public int GetHashCode(AssemblyName obj) + public int GetHashCode(AssemblyNameInfo obj) { - return obj.Name?.GetHashCode() ?? 0; + return obj.Name.GetHashCode(); } } } diff --git a/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.TypeForwarders.cs b/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.TypeForwarders.cs index 18b4fda945209..d95dba55b1e93 100644 --- a/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.TypeForwarders.cs +++ b/src/coreclr/tools/aot/ILCompiler.MetadataTransform/ILCompiler/Metadata/Transform.TypeForwarders.cs @@ -10,7 +10,7 @@ using Ecma = System.Reflection.Metadata; using Debug = System.Diagnostics.Debug; -using AssemblyName = System.Reflection.AssemblyName; +using AssemblyNameInfo = System.Reflection.Metadata.AssemblyNameInfo; using AssemblyContentType = System.Reflection.AssemblyContentType; using AssemblyNameFlags = System.Reflection.AssemblyNameFlags; using AssemblyFlags = System.Reflection.AssemblyFlags; @@ -65,20 +65,14 @@ private void InitializeTypeForwarder(ForwarderKey key, TypeForwarder record) NamespaceDefinition namespaceDefinition = HandleNamespaceDefinition(module, ns); Ecma.AssemblyReference assemblyRef = reader.GetAssemblyReference((Ecma.AssemblyReferenceHandle)exportedType.Implementation); - AssemblyName refName = new AssemblyName - { - ContentType = (AssemblyContentType)((int)(assemblyRef.Flags & AssemblyFlags.ContentTypeMask) >> 9), - Flags = (AssemblyNameFlags)(assemblyRef.Flags & ~AssemblyFlags.ContentTypeMask), - CultureName = reader.GetString(assemblyRef.Culture), - Name = reader.GetString(assemblyRef.Name), - Version = assemblyRef.Version, - }; - - if ((assemblyRef.Flags & AssemblyFlags.PublicKey) != 0) - refName.SetPublicKey(reader.GetBlobBytes(assemblyRef.PublicKeyOrToken)); - else - refName.SetPublicKeyToken(reader.GetBlobBytes(assemblyRef.PublicKeyOrToken)); - + AssemblyNameInfo refName = new AssemblyNameInfo + ( + name: reader.GetString(assemblyRef.Name), + version: assemblyRef.Version, + cultureName: reader.GetString(assemblyRef.Culture), + flags: (AssemblyNameFlags)assemblyRef.Flags, + publicKeyOrToken: reader.GetBlobContent(assemblyRef.PublicKeyOrToken) + ); record.Scope = HandleScopeReference(refName); namespaceDefinition.TypeForwarders.Add(record); diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ManifestMetadataTableNode.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ManifestMetadataTableNode.cs index 0571b6922acfb..4a8e3008412ad 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ManifestMetadataTableNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ManifestMetadataTableNode.cs @@ -37,10 +37,10 @@ public class ManifestMetadataTableNode : HeaderTableNode private readonly Dictionary _assemblyRefToModuleIdMap; /// - /// Map from module index to the AssemblyName for the module. This only contains modules + /// Map from module index to the AssemblyNameInfo for the module. This only contains modules /// that were actually loaded and is populated by ModuleToIndex. /// - private readonly Dictionary _moduleIdToAssemblyNameMap; + private readonly Dictionary _moduleIdToAssemblyNameMap; /// /// MVIDs of the assemblies included in manifest metadata to be emitted as the @@ -84,7 +84,7 @@ public class ManifestMetadataTableNode : HeaderTableNode public ManifestMetadataTableNode(NodeFactory nodeFactory) { _assemblyRefToModuleIdMap = new Dictionary(); - _moduleIdToAssemblyNameMap = new Dictionary(); + _moduleIdToAssemblyNameMap = new Dictionary(); _manifestAssemblyMvids = new List(); _signatureEmitters = new List(); _nodeFactory = nodeFactory; @@ -231,7 +231,7 @@ private int ModuleToIndexInternal(IEcmaModule module) return 0; } - AssemblyName assemblyName = emodule.Assembly.GetName(); + AssemblyNameInfo assemblyName = emodule.Assembly.GetName(); int assemblyRefIndex; if (!_assemblyRefToModuleIdMap.TryGetValue(assemblyName.Name, out assemblyRefIndex)) { @@ -298,7 +298,7 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) foreach (var idAndAssemblyName in _moduleIdToAssemblyNameMap.OrderBy(x => x.Key)) { - AssemblyName assemblyName = idAndAssemblyName.Value; + AssemblyNameInfo assemblyName = idAndAssemblyName.Value; var handle = _mutableModule.TryGetAssemblyRefHandle(assemblyName); Debug.Assert(handle.HasValue); Debug.Assert(((handle.Value & 0xFFFFFF) + (_assemblyRefCount)) == (idAndAssemblyName.Key - 1)); diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/IBC/MIbcProfileParser.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/IBC/MIbcProfileParser.cs index dca94d90a3fe5..4c00e5e01a1e5 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/IBC/MIbcProfileParser.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/IBC/MIbcProfileParser.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO.Compression; -using System.Reflection; +using System.Reflection.Metadata; using Internal.TypeSystem; using Internal.TypeSystem.Ecma; @@ -656,14 +656,14 @@ public override object GetType(string nameSpace, string name, NotFoundBehavior n } } - public AssemblyName GetName() + public AssemblyNameInfo GetName() { - return new AssemblyName("System.Private.Canon"); + return new AssemblyNameInfo("System.Private.Canon"); } } private CanonModule _canonModule; - private AssemblyName _canonModuleName; + private AssemblyNameInfo _canonModuleName; private IModuleResolver _wrappedResolver; public CustomCanonResolver(TypeSystemContext wrappedContext) @@ -673,7 +673,7 @@ public CustomCanonResolver(TypeSystemContext wrappedContext) _wrappedResolver = wrappedContext; } - ModuleDesc IModuleResolver.ResolveAssembly(AssemblyName name, bool throwIfNotFound) + ModuleDesc IModuleResolver.ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound) { if (name.Name == _canonModuleName.Name) return _canonModule; diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/TypeSystem/Mutable/MutableModule.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/TypeSystem/Mutable/MutableModule.cs index 47770a109354d..c695aa1d97c8a 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/TypeSystem/Mutable/MutableModule.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/TypeSystem/Mutable/MutableModule.cs @@ -74,7 +74,7 @@ protected override EntityHandle GetNonNestedResolutionScope(MetadataType metadat return result; } - public ManagedBinaryEmitterForInternalUse(AssemblyName assemblyName, + public ManagedBinaryEmitterForInternalUse(AssemblyNameInfo assemblyName, TypeSystemContext typeSystemContext, AssemblyFlags assemblyFlags, byte[] publicKeyArray, @@ -166,9 +166,7 @@ public Cache(MutableModule module, string assemblyName, AssemblyFlags assemblyFl private void ResetEmitter() { _reader = null; - AssemblyName assemblyName = new AssemblyName(); - assemblyName.Name = _assemblyName; - assemblyName.Version = _version; + AssemblyNameInfo assemblyName = new AssemblyNameInfo(name: _assemblyName, version: _version); _currentBinaryEmitter = new ManagedBinaryEmitterForInternalUse(assemblyName, _module.Context, _assemblyFlags, _publicKeyArray, _hashAlgorithm, _moduleToIndex, _module); foreach (var entry in _values) @@ -298,7 +296,7 @@ public MutableModule(TypeSystemContext context, _cache = new Cache(this, assemblyName, assemblyFlags, publicKeyArray, version, hashAlgorithm, moduleToIndex); TryGetHandle = _cache.CreateCacheFunc(GetHandleForTypeSystemEntity); TryGetStringHandle = _cache.CreateCacheFunc(GetUserStringHandle); - TryGetAssemblyRefHandle = _cache.CreateCacheFunc(GetAssemblyRefHandle); + TryGetAssemblyRefHandle = _cache.CreateCacheFunc(GetAssemblyRefHandle); } class DisableNewTokensException : Exception { } @@ -320,12 +318,12 @@ private int GetUserStringHandle(TypeSystemMetadataEmitter emitter, object str) private int GetAssemblyRefHandle(TypeSystemMetadataEmitter emitter, object name) { - return MetadataTokens.GetToken(emitter.GetAssemblyRef((AssemblyName)name)); + return MetadataTokens.GetToken(emitter.GetAssemblyRef((AssemblyNameInfo)name)); } public Func TryGetHandle { get; } public Func TryGetStringHandle { get; } - public Func TryGetAssemblyRefHandle { get; } + public Func TryGetAssemblyRefHandle { get; } public EntityHandle? TryGetEntityHandle(TypeSystemEntity tse) { var handle = TryGetHandle(tse); diff --git a/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TrimmingDriver.cs b/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TrimmingDriver.cs index f215d07a023b6..689c1327f538f 100644 --- a/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TrimmingDriver.cs +++ b/src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/TrimmingDriver.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Reflection.Metadata; using System.Runtime.InteropServices; using System.Xml; using ILCompiler; @@ -190,7 +191,7 @@ private static IReadOnlyCollection CreateInitializerList (CompilerTy // Build a list of assemblies that have an initializer that needs to run before // any user code runs. foreach (string initAssemblyName in options.InitAssemblies) { - ModuleDesc assembly = context.ResolveAssembly (new AssemblyName (initAssemblyName), throwIfNotFound: true); + ModuleDesc assembly = context.ResolveAssembly (new AssemblyNameInfo (initAssemblyName), throwIfNotFound: true); assembliesWithInitalizers.Add (assembly); } diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/SignatureTests.cs b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/SignatureTests.cs index 767f7d760d4a8..152816f1a5483 100644 --- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/SignatureTests.cs +++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/SignatureTests.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection.Metadata; using System.Text; using Internal.IL; @@ -145,7 +146,7 @@ public void TestSerializedSignatureWithArrayShapes() MethodDesc methodWithInterestingShapes = modOptTester.GetMethods().Single(m => string.Equals(m.Name, "Method4")); // Create assembly with reference to interesting method - TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new System.Reflection.AssemblyName("Lookup"), _context); + TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new AssemblyNameInfo("Lookup"), _context); var token = metadataEmitter.GetMethodRef(methodWithInterestingShapes); Stream peStream = new MemoryStream(); metadataEmitter.SerializeToStream(peStream); @@ -173,7 +174,7 @@ public void TestSerializedSignatureWithReferenceToMDIntArray() var typeInInitialContext = _context.GetWellKnownType(WellKnownType.Int32).MakeArrayType(3); // Create assembly with reference to interesting type - TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new System.Reflection.AssemblyName("Lookup"), _context); + TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new AssemblyNameInfo("Lookup"), _context); var token = metadataEmitter.GetTypeRef(typeInInitialContext); Stream peStream = new MemoryStream(); metadataEmitter.SerializeToStream(peStream); @@ -202,7 +203,7 @@ public void TestSerializedSignatureWithReferenceToFieldWithModOpt() FieldDesc fieldWithModOpt = modOptTester.GetFields().Single(m => string.Equals(m.Name, "fieldWithModOpt")); // Create assembly with reference to interesting method - TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new System.Reflection.AssemblyName("Lookup"), _context); + TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new AssemblyNameInfo("Lookup"), _context); var token = metadataEmitter.GetFieldRef(fieldWithModOpt); MemoryStream peStream = new MemoryStream(); metadataEmitter.SerializeToStream(peStream); diff --git a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs index cffbf2ee2da4f..2c36aa24ed080 100644 --- a/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs +++ b/src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/TestTypeSystemContext.cs @@ -8,6 +8,7 @@ using ILCompiler; using Internal.TypeSystem; using System.Reflection; +using System.Reflection.Metadata; using System.Reflection.PortableExecutable; using System.IO; @@ -61,7 +62,7 @@ public ModuleDesc CreateModuleForSimpleName(string simpleName, Stream preLoadedF return module; } - public override ModuleDesc ResolveAssembly(System.Reflection.AssemblyName name, bool throwIfNotFound) + public override ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound) { return GetModuleForSimpleName(name.Name); } diff --git a/src/coreclr/tools/aot/ILCompiler/Program.cs b/src/coreclr/tools/aot/ILCompiler/Program.cs index baf589f6af494..91b4f8f02cf9a 100644 --- a/src/coreclr/tools/aot/ILCompiler/Program.cs +++ b/src/coreclr/tools/aot/ILCompiler/Program.cs @@ -9,7 +9,7 @@ using System.CommandLine.Help; using System.CommandLine.Parsing; using System.IO; -using System.Reflection; +using System.Reflection.Metadata; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -52,7 +52,7 @@ private IReadOnlyCollection CreateInitializerList(CompilerTypeSystem // any user code runs. foreach (string initAssemblyName in Get(_command.InitAssemblies)) { - ModuleDesc assembly = context.ResolveAssembly(new AssemblyName(initAssemblyName), throwIfNotFound: true); + ModuleDesc assembly = context.ResolveAssembly(new AssemblyNameInfo(initAssemblyName), throwIfNotFound: true); assembliesWithInitializers.Add(assembly); } diff --git a/src/coreclr/tools/aot/ILCompiler/RdXmlRootProvider.cs b/src/coreclr/tools/aot/ILCompiler/RdXmlRootProvider.cs index 6d263eddc1eb5..ea8195c2fabfe 100644 --- a/src/coreclr/tools/aot/ILCompiler/RdXmlRootProvider.cs +++ b/src/coreclr/tools/aot/ILCompiler/RdXmlRootProvider.cs @@ -4,13 +4,12 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection.Metadata; using System.Xml.Linq; using Internal.TypeSystem; using Internal.TypeSystem.Ecma; -using AssemblyName = System.Reflection.AssemblyName; - namespace ILCompiler { /// @@ -59,7 +58,7 @@ private void ProcessAssemblyDirective(IRootingServiceProvider rootProvider, XEle if (assemblyNameAttribute == null) throw new Exception("The \"Name\" attribute is required on the \"Assembly\" Runtime Directive."); - ModuleDesc assembly = _context.ResolveAssembly(new AssemblyName(assemblyNameAttribute.Value)); + ModuleDesc assembly = _context.ResolveAssembly(new AssemblyNameInfo(assemblyNameAttribute.Value)); rootProvider.RootModuleMetadata(assembly, "RD.XML root"); diff --git a/src/coreclr/tools/dotnet-pgo/MibcEmitter.cs b/src/coreclr/tools/dotnet-pgo/MibcEmitter.cs index 8491a25991c0a..2379a45e31f31 100644 --- a/src/coreclr/tools/dotnet-pgo/MibcEmitter.cs +++ b/src/coreclr/tools/dotnet-pgo/MibcEmitter.cs @@ -244,7 +244,7 @@ public static void GenerateConfigData(MibcConfig config, TypeSystemMetadataEmitt public static int GenerateMibcFile(MibcConfig config, TypeSystemContext tsc, FileInfo outputFileName, IEnumerable methodsToAttemptToPlaceIntoProfileData, bool validate, bool uncompressed) { - TypeSystemMetadataEmitter emitter = new TypeSystemMetadataEmitter(new AssemblyName(outputFileName.Name), tsc); + TypeSystemMetadataEmitter emitter = new TypeSystemMetadataEmitter(new AssemblyNameInfo(outputFileName.Name), tsc); emitter.InjectSystemPrivateCanon(); emitter.AllowUseOfAddGlobalMethod(); diff --git a/src/coreclr/tools/dotnet-pgo/PgoRootCommand.cs b/src/coreclr/tools/dotnet-pgo/PgoRootCommand.cs index bf674406e1231..f7a7b7edd66c3 100644 --- a/src/coreclr/tools/dotnet-pgo/PgoRootCommand.cs +++ b/src/coreclr/tools/dotnet-pgo/PgoRootCommand.cs @@ -9,7 +9,7 @@ using System.CommandLine.Parsing; using System.Diagnostics; using System.IO; -using System.Reflection; +using System.Reflection.Metadata; namespace Microsoft.Diagnostics.Tools.Pgo { @@ -61,7 +61,7 @@ internal sealed class PgoRootCommand : CliRootCommand new("--dump-worst-overlap-graphs-to") { Description = "Number of graphs to dump to .dot format in dump-worst-overlap-graphs-to directory" }; public CliOption AutomaticReferences { get; } = new("--automatic-references") { DefaultValueFactory = _ => true, Description = "Attempt to find references by using paths embedded in the trace file. Defaults to true" }; - public CliOption IncludedAssemblies { get; } = + public CliOption IncludedAssemblies { get; } = new("--include-reference") { CustomParser = MakeAssemblyNameArray, DefaultValueFactory = MakeAssemblyNameArray, Description = "If specified, include in Mibc file only references to the specified assemblies. Assemblies are specified as assembly names, not filenames. For instance, `System.Private.CoreLib` not `System.Private.CoreLib.dll`. Multiple --include-reference options may be specified." }; private CliOption _includeReadyToRun { get; } = @@ -285,16 +285,16 @@ public static IEnumerable> GetExtendedHelp(HelpContext c } } - private static AssemblyName[] MakeAssemblyNameArray(ArgumentResult result) + private static AssemblyNameInfo[] MakeAssemblyNameArray(ArgumentResult result) { if (result.Tokens.Count > 0) { - var includedAssemblies = new List(); + var includedAssemblies = new List(); foreach (CliToken token in result.Tokens) { try { - includedAssemblies.Add(new AssemblyName(token.Value)); + includedAssemblies.Add(new AssemblyNameInfo(token.Value)); } catch { @@ -304,7 +304,7 @@ private static AssemblyName[] MakeAssemblyNameArray(ArgumentResult result) return includedAssemblies.ToArray(); } - return Array.Empty(); + return Array.Empty(); } } } diff --git a/src/coreclr/tools/dotnet-pgo/Program.cs b/src/coreclr/tools/dotnet-pgo/Program.cs index e5ce52f1b9956..af0765d4c0acb 100644 --- a/src/coreclr/tools/dotnet-pgo/Program.cs +++ b/src/coreclr/tools/dotnet-pgo/Program.cs @@ -414,7 +414,7 @@ private int InnerMergeMain() } HashSet assemblyNamesInBubble = null; - AssemblyName[] assemblies = Get(_command.IncludedAssemblies); + AssemblyNameInfo[] assemblies = Get(_command.IncludedAssemblies); if (assemblies.Length > 0) { assemblyNamesInBubble = new HashSet(); diff --git a/src/coreclr/tools/dotnet-pgo/TraceRuntimeDescToTypeSystemDesc.cs b/src/coreclr/tools/dotnet-pgo/TraceRuntimeDescToTypeSystemDesc.cs index 8ed1857045d01..380aa017d9a7f 100644 --- a/src/coreclr/tools/dotnet-pgo/TraceRuntimeDescToTypeSystemDesc.cs +++ b/src/coreclr/tools/dotnet-pgo/TraceRuntimeDescToTypeSystemDesc.cs @@ -291,7 +291,7 @@ public ModuleDesc ResolveModuleID(long handle, bool throwIfNotFound = true) return null; } - minfo.Module = _context.ResolveAssembly(new AssemblyName(minfo.AssemblyName), throwIfNotFound); + minfo.Module = _context.ResolveAssembly(new AssemblyNameInfo(minfo.AssemblyName), throwIfNotFound); return minfo.Module; } else diff --git a/src/coreclr/tools/dotnet-pgo/TraceTypeSystemContext.cs b/src/coreclr/tools/dotnet-pgo/TraceTypeSystemContext.cs index 3e0948c9392a8..33e11d92d023b 100644 --- a/src/coreclr/tools/dotnet-pgo/TraceTypeSystemContext.cs +++ b/src/coreclr/tools/dotnet-pgo/TraceTypeSystemContext.cs @@ -95,7 +95,7 @@ protected override ModuleData CreateValueFromKey(EcmaModule key) private readonly Dictionary _simpleNameHashtable = new Dictionary(StringComparer.OrdinalIgnoreCase); - public override ModuleDesc ResolveAssembly(System.Reflection.AssemblyName name, bool throwIfNotFound) + public override ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound) { // TODO: catch typesystem BadImageFormatException and throw a new one that also captures the // assembly name that caused the failure. (Along with the reason, which makes this rather annoying). diff --git a/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemContext.cs b/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemContext.cs index 31a5caee14c23..6c496e90d6848 100644 --- a/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemContext.cs +++ b/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemContext.cs @@ -42,7 +42,7 @@ public TypeRefTypeSystemContext(IEnumerable refReaders) { _refReaders = refReaders.ToArray(); - TypeRefTypeSystemModule coreLibModule = new TypeRefTypeSystemModule(this, new System.Reflection.AssemblyName("System.Private.CoreLib")); + TypeRefTypeSystemModule coreLibModule = new TypeRefTypeSystemModule(this, new AssemblyNameInfo("System.Private.CoreLib")); foreach (string name in MetadataTypeSystemContext.WellKnownTypeNames) { coreLibModule.GetOrAddType("System", name); @@ -198,7 +198,7 @@ private TypeRefTypeSystemType ResolveTypeRef(PEInfo peInfo, TypeReferenceHandle string assemblyName = peInfo.reader.GetString(assemblyReference.Name); if (!_typeRefModules.TryGetValue(assemblyName, out module)) { - module = new TypeRefTypeSystemModule(this, new System.Reflection.AssemblyName(assemblyName)); + module = new TypeRefTypeSystemModule(this, new AssemblyNameInfo(assemblyName)); _typeRefModules.Add(module.Assembly.GetName().Name, module); } peInfo.assemblyLookup.Add(asmRefHandle, module); @@ -219,7 +219,7 @@ private TypeRefTypeSystemType ResolveTypeRef(PEInfo peInfo, TypeReferenceHandle return type; } - public override ModuleDesc ResolveAssembly(AssemblyName name, bool throwIfNotFound = true) + public override ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound = true) { if (_typeRefModules.TryGetValue(name.Name, out TypeRefTypeSystemModule foundModule)) { diff --git a/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemModule.cs b/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemModule.cs index 701263024246b..0b3b788c49c48 100644 --- a/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemModule.cs +++ b/src/coreclr/tools/dotnet-pgo/TypeRefTypeSystem/TypeRefTypeSystemModule.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; +using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using Internal.TypeSystem; @@ -13,12 +13,12 @@ namespace Microsoft.Diagnostics.Tools.Pgo.TypeRefTypeSystem { class TypeRefTypeSystemModule : ModuleDesc, IAssemblyDesc { - AssemblyName _name; + AssemblyNameInfo _name; List _types = new List(); Dictionary _nonNamespacedTypes = new Dictionary(); Dictionary> _namespacedTypes = new Dictionary>(); - public TypeRefTypeSystemModule(TypeSystemContext tsc, AssemblyName name) : base(tsc, null) + public TypeRefTypeSystemModule(TypeSystemContext tsc, AssemblyNameInfo name) : base(tsc, null) { _name = name; } @@ -51,7 +51,7 @@ public TypeRefTypeSystemType GetOrAddType(string nameSpace, string name) public override IEnumerable GetAllTypes() => _types; public override MetadataType GetGlobalModuleType() => throw new NotImplementedException(); - public AssemblyName GetName() => _name; + public AssemblyNameInfo GetName() => _name; private TypeRefTypeSystemType GetTypeInternal(string nameSpace, string name) { Dictionary nameToTypeDictionary = _nonNamespacedTypes; From a850c6f191d284ed60d0e0582e1dc5dc44405ef4 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Thu, 9 May 2024 10:37:43 -0700 Subject: [PATCH 2/2] Fixes --- .../TypeSystemMetadataEmitter.cs | 19 ++++++++++--------- .../DependencyAnalysis/ResourceIndexNode.cs | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs index 9afbca2c7aaf1..76582ef0e29ab 100644 --- a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs +++ b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs @@ -121,20 +121,21 @@ public byte[] EmitToMetadataBlob() public AssemblyReferenceHandle GetAssemblyRef(AssemblyNameInfo name) { + // References use a public key token instead of full public key. + if ((name.Flags & AssemblyNameFlags.PublicKey) != 0) + { + // Use AssemblyName to convert PublicKey to PublicKeyToken to avoid calling crypto APIs directly + AssemblyName an = new(); + an.SetPublicKey(ImmutableCollectionsMarshal.AsArray(name.PublicKeyOrToken)); + name = new AssemblyNameInfo(name.Name, name.Version, name.CultureName, name.Flags & ~AssemblyNameFlags.PublicKey, ImmutableCollectionsMarshal.AsImmutableArray(an.GetPublicKeyToken())); + } + if (!_assemblyRefNameHandles.TryGetValue(name.FullName, out var handle)) { StringHandle assemblyName = _metadataBuilder.GetOrAddString(name.Name); StringHandle cultureName = (name.CultureName != null) ? _metadataBuilder.GetOrAddString(name.CultureName) : default(StringHandle); - ImmutableArray publicKeyOrToken = name.PublicKeyOrToken; - if ((name.Flags & AssemblyNameFlags.PublicKey) != 0) - { - // Use AssemblyName to convert PublicKey to PublicKeyToken to avoid calling crypto APIs directly - AssemblyName an = new(); - an.SetPublicKey(ImmutableCollectionsMarshal.AsArray(publicKeyOrToken)); - publicKeyOrToken = ImmutableCollectionsMarshal.AsImmutableArray(an.GetPublicKeyToken()); - } - BlobHandle publicTokenBlob = publicKeyOrToken.IsDefault ? default : _metadataBuilder.GetOrAddBlob(publicKeyOrToken); + BlobHandle publicTokenBlob = name.PublicKeyOrToken.IsDefault ? default : _metadataBuilder.GetOrAddBlob(name.PublicKeyOrToken); AssemblyFlags flags = (AssemblyFlags)name.Flags & (AssemblyFlags.Retargetable | AssemblyFlags.ContentTypeMask); diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ResourceIndexNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ResourceIndexNode.cs index 50e496584eadd..847f42cc2a1d1 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ResourceIndexNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ResourceIndexNode.cs @@ -2,6 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Reflection; +using System.Reflection.Metadata; +using System.Runtime.InteropServices; using Internal.NativeFormat; using Internal.Text; @@ -74,7 +77,19 @@ private byte[] GenerateIndexBlob(NodeFactory factory) foreach (ResourceIndexData indexData in _resourceDataNode.GetOrCreateIndexData(factory)) { - string assemblyName = indexData.Assembly.GetName().FullName; + AssemblyNameInfo name = indexData.Assembly.GetName(); + + // References use a public key token instead of full public key. + if ((name.Flags & AssemblyNameFlags.PublicKey) != 0) + { + // Use AssemblyName to convert PublicKey to PublicKeyToken to avoid calling crypto APIs directly + AssemblyName an = new(); + an.SetPublicKey(ImmutableCollectionsMarshal.AsArray(name.PublicKeyOrToken)); + name = new AssemblyNameInfo(name.Name, name.Version, name.CultureName, name.Flags & ~AssemblyNameFlags.PublicKey, ImmutableCollectionsMarshal.AsImmutableArray(an.GetPublicKeyToken())); + } + + string assemblyName = name.FullName; + Vertex asmName = nativeWriter.GetStringConstant(assemblyName); Vertex resourceName = nativeWriter.GetStringConstant(indexData.ResourceName); Vertex offsetVertex = nativeWriter.GetUnsignedConstant((uint)indexData.NativeOffset);