AtomicEditor.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.IO;
  3. using System.Diagnostics;
  4. using System.Collections.Generic;
  5. using System.Collections.Immutable;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Reflection.Metadata;
  9. using System.Reflection.PortableExecutable;
  10. using System.Reflection.Metadata.Ecma335;
  11. using System.Text;
  12. using AtomicEngine;
  13. using File = System.IO.File;
  14. namespace AtomicEditor
  15. {
  16. class AssemblyInspector
  17. {
  18. public static void InspectAssembly (String pathToAssembly)
  19. {
  20. try {
  21. using (var stream = File.OpenRead (pathToAssembly))
  22. using (var peFile = new PEReader (stream)) {
  23. var reader = peFile.GetMetadataReader ();
  24. foreach (var handle in reader.TypeDefinitions)
  25. {
  26. var typeDef = reader.GetTypeDefinition(handle);
  27. var baseTypeHandle = typeDef.BaseType;
  28. if (baseTypeHandle.Kind == HandleKind.TypeReference)
  29. {
  30. var typeRef = reader.GetTypeReference((TypeReferenceHandle)baseTypeHandle);
  31. // TODO: validate assembly of CSComponent typeref
  32. if (reader.GetString(typeRef.Name) != "CSComponent")
  33. continue;
  34. var inspector = new CSComponentInspector(typeDef, peFile, reader);
  35. inspector.Inspect();
  36. }
  37. }
  38. //uint size, packingSize;
  39. //bool hasLayout = entry.GetTypeLayout(out size, out packingSize);
  40. /*
  41. Console.WriteLine(reader.GetString(entry.Name));
  42. var fields = entry.GetFields();
  43. foreach (var fieldHandle in fields)
  44. {
  45. // FieldDefinitionHandle
  46. var fieldDef = reader.GetFieldDefinition(fieldHandle);
  47. Console.WriteLine("Field! {0}", reader.GetString(fieldDef.Name));
  48. }
  49. var methods = entry.GetMethods();
  50. foreach (var methodHandle in methods)
  51. {
  52. // FieldDefinitionHandle
  53. var methodDef = reader.GetMethodDefinition(methodHandle);
  54. if (reader.GetString(methodDef.Name) == ".ctor")
  55. {
  56. Console.WriteLine("Dumping ctor");
  57. var body = peFile.GetMethodBody(methodDef.RelativeVirtualAddress);
  58. /*
  59. var value = CSComponentInspector.Instance.DumpMethod(
  60. reader,
  61. entry,
  62. body.MaxStack,
  63. body.GetILContent(),
  64. ImmutableArray.Create<CSComponentInspector.LocalInfo>(), // TODO
  65. ImmutableArray.Create<CSComponentInspector.HandlerSpan>());
  66. Console.WriteLine("IL: \n{0}", value);
  67. */
  68. /*
  69. }
  70. }
  71. }
  72. */
  73. }
  74. } catch (Exception ex) {
  75. Console.WriteLine (ex.Message);
  76. }
  77. }
  78. }
  79. }