Skip to content

Instantly share code, notes, and snippets.

@ufcpp
Created December 15, 2020 10:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ufcpp/02ea05dc56de6c0fdff85d8ab91fb6a2 to your computer and use it in GitHub Desktop.
Save ufcpp/02ea05dc56de6c0fdff85d8ab91fb6a2 to your computer and use it in GitHub Desktop.
参照してる dll のバージョン調査
#define A
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
var folders = new[]
{
"調べたい dll を置いてるフォルダー一覧"
};
var asms = LoadAll(folders);
#if A
foreach (var asm in asms) Write(asm);
#endif
#if B
var g = asms.SelectMany(a => a.Refs).Distinct().GroupBy(r => r.Name);
foreach (var r in g)
{
Console.WriteLine(r.Key);
foreach (var (_, v) in r)
{
Console.Write(" ");
Console.WriteLine(v);
}
}
#endif
#if C
var list = new HashSet<string>(new[]
{
"表示するものを絞るためのリスト"
"System.Memory",
"System.Threading.Tasks.Extensions",
"System.Runtime.CompilerServices.Unsafe",
"System.Buffers",
});
foreach (var asm in asms)
{
if (list.Contains(asm.Def.Name))
{
Console.WriteLine("def " + asm.Def);
}
foreach (var r in asm.Refs)
{
if (list.Contains(r.Name))
{
Console.WriteLine("ref " + r + " from " + asm.Def.Name);
}
}
}
#endif
IEnumerable<Asm> LoadAll(string[] folders)
{
foreach (var folder in folders)
{
foreach (var dllPath in Directory.GetFiles(folder, "*.dll"))
{
yield return Load(dllPath);
}
}
}
Asm Load(string path)
{
using var file = System.IO.File.OpenRead(path);
using var pe = new PEReader(file);
var mr = pe.GetMetadataReader();
var def = mr.GetAssemblyDefinition();
var refs = new AsmDef[mr.AssemblyReferences.Count];
int i = 0;
foreach (var arh in mr.AssemblyReferences)
{
var ar = mr.GetAssemblyReference(arh);
var name = mr.GetString(ar.Name);
refs[i++] = new(name, ar.Version);
}
return new Asm(new(mr.GetString(def.Name), def.Version), refs);
}
void Write(Asm asm)
{
Console.WriteLine(asm.Def);
foreach (var r in asm.Refs)
{
Console.Write(" ");
Console.WriteLine(r);
}
}
record AsmDef(string Name, Version Version)
{
public override string ToString() => (Name, Version).ToString();
}
record Asm(AsmDef Def, AsmDef[] Refs);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment