Created
January 9, 2020 09:01
-
-
Save ufcpp/969dc03dedbf2281b3ade9b731c8ad1e to your computer and use it in GitHub Desktop.
DLL の依存関係を調べる。bin フォルダーに作られる .deps.json の中から同じ情報取れそうかも。
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
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Reflection.Metadata; | |
using System.Reflection.PortableExecutable; | |
static class Program | |
{ | |
static void Main() | |
{ | |
var format = @"[path to dll files]\{0}.dll"; | |
string getFullname(string name) => string.Format(format, name); | |
void getReferences(string target, HashSet<string> assemblyNames) | |
{ | |
using var pe = new PEReader(File.OpenRead(getFullname(target))); | |
var m = pe.GetMetadataReader(); | |
foreach (var rh in m.AssemblyReferences) | |
{ | |
var r = m.GetAssemblyReference(rh); | |
var name = m.GetString(r.Name); | |
if (assemblyNames.Contains(name)) continue; | |
var fullname = getFullname(name); | |
if (!File.Exists(fullname)) continue; | |
assemblyNames.Add(name); | |
getReferences(name, assemblyNames); | |
} | |
} | |
#if true | |
var target = "[dll name]"; | |
var assemblyNames = new HashSet<string>(); | |
getReferences(target, assemblyNames); | |
foreach (var name in assemblyNames) | |
{ | |
Console.WriteLine(name); | |
} | |
Console.WriteLine(assemblyNames.Count); | |
#endif | |
#if tru | |
const int Tab = 2; | |
static void writeTab(int nest) | |
{ | |
for (int i = 0; i < nest * Tab; i++) | |
{ | |
Console.Write(' '); | |
} | |
} | |
void writeHierarchy(string target, int nest = 0) | |
{ | |
using var pe = new PEReader(File.OpenRead(getFullname(target))); | |
var m = pe.GetMetadataReader(); | |
foreach (var rh in m.AssemblyReferences) | |
{ | |
var r = m.GetAssemblyReference(rh); | |
var name = m.GetString(r.Name); | |
var fullname = getFullname(name); | |
if (!File.Exists(fullname)) continue; | |
writeTab(nest); | |
Console.WriteLine(name); | |
writeHierarchy(name, nest + 1); | |
} | |
} | |
writeHierarchy(target); | |
#endif | |
#if tru | |
Console.WriteLine("----------------------------"); | |
foreach (var rh in m.TypeReferences) | |
{ | |
var r = m.GetTypeReference(rh); | |
var arh = getAsmRef(r); | |
Console.WriteLine($"{m.GetString(r.Name)} {m.GetString(m.GetAssemblyReference(arh).Name)}"); | |
} | |
AssemblyReferenceHandle getAsmRef(TypeReference r) | |
{ | |
var h = r.ResolutionScope; | |
if (h.Kind == HandleKind.AssemblyReference) | |
{ | |
return (AssemblyReferenceHandle)h; | |
} | |
if (h.Kind == HandleKind.TypeReference) | |
{ | |
var t = m.GetTypeReference((TypeReferenceHandle)h); | |
return getAsmRef(t); | |
} | |
throw new InvalidOperationException(); | |
} | |
#endif | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment