/* Copyright (C) 2014-2019 de4dot@gmail.com This file is part of dnSpy dnSpy is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. dnSpy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with dnSpy. If not, see . */ using System; using System.IO; namespace dnSpy.Debugger.DotNet.Metadata { /// /// A read only assembly name /// public sealed class DmdReadOnlyAssemblyName : IDmdAssemblyName { /// /// Gets the simple name /// public string? Name { get; } /// /// Gets the version /// public Version? Version { get; } /// /// Gets the culture name /// public string? CultureName { get; } /// /// Gets the flags /// public DmdAssemblyNameFlags RawFlags { get; } /// /// Gets the flags. The content type and processor architecture bits are ignored, use instead /// public DmdAssemblyNameFlags Flags => RawFlags & ~(DmdAssemblyNameFlags.ContentType_Mask | DmdAssemblyNameFlags.PA_FullMask); /// /// Gets the processor architecture /// public DmdProcessorArchitecture ProcessorArchitecture => (DmdProcessorArchitecture)((int)(RawFlags & DmdAssemblyNameFlags.PA_Mask) >> 4); /// /// Gets the content type /// public DmdAssemblyContentType ContentType => (DmdAssemblyContentType)((int)(RawFlags & DmdAssemblyNameFlags.ContentType_Mask) >> 9); /// /// Gets the public key /// /// public byte[]? GetPublicKey() => publicKey; readonly byte[]? publicKey; /// /// Gets the public key token /// /// public byte[]? GetPublicKeyToken() { if (publicKeyToken is null && publicKey is not null) { try { publicKeyToken = AssemblyHasher.CreatePublicKeyToken(publicKey); } catch (IOException) { } } return publicKeyToken; } byte[]? publicKeyToken; /// /// Gets the hash algorithm /// public DmdAssemblyHashAlgorithm HashAlgorithm { get; } /// /// Gets the full assembly name /// public string FullName => DmdAssemblyNameFormatter.Format(Name, Version, CultureName, GetPublicKeyToken(), RawFlags, isPublicKeyToken: true); /// /// Constructor /// /// Assembly name public DmdReadOnlyAssemblyName(string assemblyName) { if (assemblyName is null) throw new ArgumentNullException(nameof(assemblyName)); Impl.DmdTypeNameParser.ParseAssemblyName(assemblyName, out var name, out var version, out var cultureName, out var flags, out publicKey, out publicKeyToken, out var hashAlgorithm); Name = name; Version = version; CultureName = cultureName; RawFlags = flags; HashAlgorithm = hashAlgorithm; } /// /// Constructor /// /// Simple name /// Version /// Culture or null /// Flags /// Public key or null /// Public key token or null /// Hash algorithm public DmdReadOnlyAssemblyName(string? name, Version? version, string? cultureName, DmdAssemblyNameFlags flags, byte[]? publicKey, byte[]? publicKeyToken, DmdAssemblyHashAlgorithm hashAlgorithm) { Name = name; Version = version; CultureName = cultureName; RawFlags = flags; this.publicKey = publicKey; this.publicKeyToken = publicKeyToken; HashAlgorithm = hashAlgorithm; } /// /// Constructor /// /// Simple name /// Version /// Culture or null /// Flags /// Public key or public key token or null /// Hash algorithm public DmdReadOnlyAssemblyName(string? name, Version? version, string? cultureName, DmdAssemblyNameFlags flags, byte[]? publicKeyOrToken, DmdAssemblyHashAlgorithm hashAlgorithm) { Name = name; Version = version; CultureName = cultureName; RawFlags = flags; if ((flags & DmdAssemblyNameFlags.PublicKey) != 0) publicKey = publicKeyOrToken; else publicKeyToken = publicKeyOrToken; HashAlgorithm = hashAlgorithm; } /// /// Constructor /// /// Assembly name public DmdReadOnlyAssemblyName(IDmdAssemblyName name) { if (name is null) throw new ArgumentNullException(nameof(name)); Name = name.Name; Version = name.Version; CultureName = name.CultureName; RawFlags = name.RawFlags; publicKey = DmdAssemblyName.CloneArray(name.GetPublicKey()); publicKeyToken = DmdAssemblyName.CloneArray(name.GetPublicKeyToken()); HashAlgorithm = name.HashAlgorithm; } /// /// Converts it to a mutable assembly name /// /// public DmdAssemblyName AsMutable() => new DmdAssemblyName(this); /// /// Creates a read only assembly name /// /// public DmdReadOnlyAssemblyName AsReadOnly() => this; /// /// Gets the full assembly name /// /// public override string ToString() => FullName; } }