You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.9 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Management.Automation;
  5. using System.Reflection.PortableExecutable;
  6. using System.Text;
  7. using ICSharpCode.Decompiler.CSharp;
  8. using ICSharpCode.Decompiler.Metadata;
  9. using ICSharpCode.Decompiler.PdbProvider;
  10. namespace ICSharpCode.Decompiler.PowerShell
  11. {
  12. [Cmdlet(VerbsCommon.Get, "Decompiler")]
  13. [OutputType(typeof(CSharpDecompiler))]
  14. public class GetDecompilerCmdlet : PSCmdlet
  15. {
  16. [Parameter(Position = 0, Mandatory = true, HelpMessage = "Path to the assembly you want to decompile")]
  17. [Alias("PSPath")]
  18. [ValidateNotNullOrEmpty]
  19. public string LiteralPath { get; set; }
  20. [Parameter(HelpMessage = "C# Language version to be used by the decompiler")]
  21. public LanguageVersion LanguageVersion { get; set; } = LanguageVersion.Latest;
  22. [Parameter(HelpMessage = "Remove dead stores")]
  23. public bool RemoveDeadStores { get; set; }
  24. [Parameter(HelpMessage = "Remove dead code")]
  25. public bool RemoveDeadCode { get; set; }
  26. [Parameter(HelpMessage = "Use PDB")]
  27. public string PDBFilePath { get; set; }
  28. protected override void ProcessRecord()
  29. {
  30. string path = GetUnresolvedProviderPathFromPSPath(LiteralPath);
  31. try
  32. {
  33. var module = new PEFile(LiteralPath, new FileStream(LiteralPath, FileMode.Open, FileAccess.Read), PEStreamOptions.Default);
  34. var debugInfo = DebugInfoUtils.FromFile(module, PDBFilePath);
  35. var decompiler = new CSharpDecompiler(path, new DecompilerSettings(LanguageVersion) {
  36. ThrowOnAssemblyResolveErrors = false,
  37. RemoveDeadCode = RemoveDeadCode,
  38. RemoveDeadStores = RemoveDeadStores,
  39. UseDebugSymbols = debugInfo != null,
  40. ShowDebugInfo = debugInfo != null,
  41. });
  42. decompiler.DebugInfoProvider = debugInfo;
  43. WriteObject(decompiler);
  44. }
  45. catch (Exception e)
  46. {
  47. WriteVerbose(e.ToString());
  48. WriteError(new ErrorRecord(e, ErrorIds.AssemblyLoadFailed, ErrorCategory.OperationStopped, null));
  49. }
  50. }
  51. }
  52. }