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.

56 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. var module = new PEFile(LiteralPath, new FileStream(LiteralPath, FileMode.Open, FileAccess.Read), PEStreamOptions.Default);
  33. var debugInfo = DebugInfoUtils.FromFile(module, PDBFilePath);
  34. var decompiler = new CSharpDecompiler(path, new DecompilerSettings(LanguageVersion) {
  35. ThrowOnAssemblyResolveErrors = false,
  36. RemoveDeadCode = RemoveDeadCode,
  37. RemoveDeadStores = RemoveDeadStores,
  38. UseDebugSymbols = debugInfo != null,
  39. ShowDebugInfo = debugInfo != null,
  40. });
  41. decompiler.DebugInfoProvider = debugInfo;
  42. WriteObject(decompiler);
  43. } catch (Exception e) {
  44. WriteVerbose(e.ToString());
  45. WriteError(new ErrorRecord(e, ErrorIds.AssemblyLoadFailed, ErrorCategory.OperationStopped, null));
  46. }
  47. }
  48. }
  49. }