Skip to content

Instantly share code, notes, and snippets.

@ufcpp
Created January 9, 2020 09:01
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/969dc03dedbf2281b3ade9b731c8ad1e to your computer and use it in GitHub Desktop.
Save ufcpp/969dc03dedbf2281b3ade9b731c8ad1e to your computer and use it in GitHub Desktop.
DLL の依存関係を調べる。bin フォルダーに作られる .deps.json の中から同じ情報取れそうかも。
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