27 lines
1.2 KiB
C#
27 lines
1.2 KiB
C#
// Read-only managed metadata extraction; does not load or execute product assemblies.
|
|
using System.Reflection.Metadata;
|
|
using System.Reflection.PortableExecutable;
|
|
using System.Text.Json;
|
|
var root = Path.GetFullPath(args[0]);
|
|
var modules = new List<object>();
|
|
foreach (var directory in args.Skip(1))
|
|
{
|
|
foreach (var path in Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories).Order())
|
|
{
|
|
try
|
|
{
|
|
using var file = File.OpenRead(path);
|
|
using var pe = new PEReader(file);
|
|
if (!pe.HasMetadata) continue;
|
|
var metadata = pe.GetMetadataReader();
|
|
if (!metadata.IsAssembly) continue;
|
|
var assembly = metadata.GetAssemblyDefinition();
|
|
modules.Add(new { file = Path.GetRelativePath(root, path).Replace(Path.DirectorySeparatorChar, '/'),
|
|
assembly = metadata.GetString(assembly.Name), version = assembly.Version.ToString(),
|
|
mvid = metadata.GetGuid(metadata.GetModuleDefinition().Mvid).ToString("D") });
|
|
}
|
|
catch (BadImageFormatException) { /* Native DLLs have no CLR module identity. */ }
|
|
}
|
|
}
|
|
Console.WriteLine(JsonSerializer.Serialize(modules));
|