using System.Reflection; using System.Reflection.Metadata; using System.Reflection.PortableExecutable; string path = "/home/dazed/.local/share/Steam/steamapps/common/worldbox/worldbox_Data/Managed/Assembly-CSharp.dll"; using var fs = File.OpenRead(path); using var pe = new PEReader(fs); var md = pe.GetMetadataReader(); foreach (var typeName in new[]{"ActorManager","MapBox","World","Finder","BaseSystemManager`1","NanoObjectManager`2"}) { Console.WriteLine("== "+typeName+" =="); foreach (var th in md.TypeDefinitions) { var t = md.GetTypeDefinition(th); var n = md.GetString(t.Name); var ns = md.GetString(t.Namespace); if (n!=typeName && !(typeName.Contains('`') && n.StartsWith(typeName.Split('`')[0]))) continue; Console.WriteLine($"TYPE {ns}.{n}"); // base type if (!t.BaseType.IsNil) { try { var bt = t.BaseType; if (bt.Kind == HandleKind.TypeReference) { var tr = md.GetTypeReference((TypeReferenceHandle)bt); Console.WriteLine(" base="+md.GetString(tr.Namespace)+"."+md.GetString(tr.Name)); } else if (bt.Kind == HandleKind.TypeSpecification) { Console.WriteLine(" base=TypeSpec"); } else if (bt.Kind == HandleKind.TypeDefinition) { var td = md.GetTypeDefinition((TypeDefinitionHandle)bt); Console.WriteLine(" base="+md.GetString(td.Namespace)+"."+md.GetString(td.Name)); } } catch (Exception ex) { Console.WriteLine(" baseerr "+ex.Message); } } foreach (var mh in t.GetMethods()) { var m = md.GetMethodDefinition(mh); var mn = md.GetString(m.Name); if (mn.StartsWith("set_") || mn is ".ctor" or ".cctor") continue; Console.WriteLine(" "+mn); } } } Console.WriteLine("== methods named getByID =="); foreach (var mh in md.MethodDefinitions) { var m = md.GetMethodDefinition(mh); var mn = md.GetString(m.Name); if (mn is "getByID" or "get" or "getActor") { // find owning type - expensive: skip, just print token Console.WriteLine(mn+" token="+mh.GetHashCode()); } }