Loading

FindUsed

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Mono.Cecil;
  5.  
  6. namespace Used
  7. {
  8.     public static class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             AssemblyDefinition
  13.                 .ReadAssembly("/Users/kanaroo/RiderProjects/Library/Library/bin/Debug/netstandard2.0/Library.dll")
  14.                 .MainModule
  15.                 .Types
  16.                 .First(x => x.FullName == "Library.Program")
  17.                 .Methods
  18.                 .First(x => x.Name == "Main")
  19.                 .PrintUsedMethods();
  20.         }
  21.  
  22.         static void PrintUsedMethods(this MethodDefinition method)
  23.         {
  24.             var visitedMethods = new HashSet<MethodDefinition>();
  25.  
  26.             var notVisitedUsedMethods = method
  27.                 .Body
  28.                 .Instructions
  29.                 .Select(x => x.Operand)
  30.                 .OfType<MethodDefinition>()
  31.                 .Where(x => !visitedMethods.Contains(x));
  32.  
  33.  
  34.             foreach (var usedMethod in notVisitedUsedMethods)
  35.             {
  36.                 visitedMethods.Add(usedMethod);
  37.                 Console.WriteLine("{0} -> {1}", method.GetFullName(), usedMethod.GetFullName());
  38.                 PrintUsedMethods(usedMethod);
  39.             }
  40.         }
  41.  
  42.         private static string GetFullName(this IMemberDefinition method)
  43.         {
  44.             return $"{method.DeclaringType.Name}.{method.Name}";
  45.         }
  46.     }
  47. }