Skip to content

[API Proposal]: Add APIs to read the AssemblyNameInfo of an assembly file. #113749

@teo-tsirpanis

Description

@teo-tsirpanis

Background and motivation

The AssemblyNameInfo type was introduced as an immutable and legacy-free counterpart of AssemblyName that does not depend on the globalization stack, but is so far being used only as a transport type and there is no API to get the AssemblyNameInfo of an assembly file. This would be useful for trimming-conscious metadata inspection code.

API Proposal

namespace System.Reflection.Metadata;

public struct AssemblyDefinition
{
     public StringHandle Culture { get; }
     public AssemblyFlags Flags { get; }
     public StringHandle Name { get; }
     public BlobHandle PublicKey { get; }
     public Version Version { get; }
+    public AssemblyNameInfo GetAssemblyNameInfo();
}

public struct AssemblyReference
{
     public StringHandle Culture { get; }
     public AssemblyFlags Flags { get; }
     public StringHandle Name { get; }
     public BlobHandle PublicKeyOrToken { get; }
     public Version Version { get; }
+    public AssemblyNameInfo GetAssemblyNameInfo();
}

public class AssemblyNameInfo
{
     public static AssemblyNameInfo Parse(ReadOnlySpan<char> assemblyFile);
+    public static AssemblyNameInfo GetAssemblyNameInfo(string assemblyFile);
}

public class MetadataReader
{
     public AssemblyDefinition GetAssemblyDefinition();
+    public static AssemblyNameInfo GetAssemblyNameInfo(string assemblyFile);
}

API Usage

using PEReader peReader = new(File.OpenRead("MyLib.dll"));
if (peReader.HasMetadata)
{
    var info = peReader.GetAssemblyNameInfo();
    Console.WriteLine(info.FullName);
}

Alternative Designs

  • MetadataReader.GetAssemblyNameInfo could be omitted. I added it for symmetry with MetadataReader.GetAssemblyName but that had a good reason to exist that is not applicable here.
  • AssemblyNameInfo.GetAssemblyNameInfo could be ommited, as we already expose AssemblyNameInfo.Parse(System.ReadOnlySpan<char> assemblyName) (and TryParse, so we can handle any input and throw or just return false for invalid inputs)

Risks

No response

Metadata

Metadata

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions