diff --git a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs index 13d3120487..c7ca9ba7f9 100644 --- a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs +++ b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs @@ -213,8 +213,6 @@ public override string ToString() #if !VSADDIN public class AssemblyReference : IAssemblyReference { - static readonly SHA1 sha1 = SHA1.Create(); - readonly System.Reflection.Metadata.AssemblyReference entry; public MetadataReader Metadata { get; } @@ -263,17 +261,28 @@ public string FullName { public Version? Version => entry.Version; public string Culture => Metadata.GetString(entry.Culture); byte[]? IAssemblyReference.PublicKeyToken => GetPublicKeyToken(); + byte[]? publicKeyToken; public byte[]? GetPublicKeyToken() { if (entry.PublicKeyOrToken.IsNil) return null; - var bytes = Metadata.GetBlobBytes(entry.PublicKeyOrToken); - if ((entry.Flags & AssemblyFlags.PublicKey) != 0) + + if (publicKeyToken == null) { - return sha1.ComputeHash(bytes).Skip(12).ToArray(); + var bytes = Metadata.GetBlobBytes(entry.PublicKeyOrToken); + if ((entry.Flags & AssemblyFlags.PublicKey) != 0) + { + using (var hasher = SHA1.Create()) + { + bytes = hasher.ComputeHash(bytes).Skip(12).ToArray(); + } + } + + publicKeyToken = bytes; } - return bytes; + + return publicKeyToken; } ImmutableArray typeReferences; diff --git a/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs b/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs index 52452be124..5155f428e3 100644 --- a/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs +++ b/ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs @@ -41,7 +41,12 @@ static string CalculatePublicKeyToken(BlobHandle blob, MetadataReader reader) { // Calculate public key token: // 1. hash the public key (always use SHA1). - byte[] publicKeyTokenBytes = SHA1.Create().ComputeHash(reader.GetBlobBytes(blob)); + byte[] publicKeyTokenBytes; + using (var hasher = SHA1.Create()) + { + publicKeyTokenBytes = hasher.ComputeHash(reader.GetBlobBytes(blob)); + } + // 2. take the last 8 bytes // 3. according to Cecil we need to reverse them, other sources did not mention this. return publicKeyTokenBytes.TakeLast(8).Reverse().ToHexString(8);