Created
December 15, 2020 10:25
-
-
Save ufcpp/02ea05dc56de6c0fdff85d8ab91fb6a2 to your computer and use it in GitHub Desktop.
参照してる dll のバージョン調査
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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