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.

62 lines
2.2 KiB

  1. using Microsoft.Build.Framework;
  2. using Microsoft.Build.Utilities;
  3. using Mono.Cecil;
  4. using System;
  5. using System.IO;
  6. namespace MSBuildTasks
  7. {
  8. public class AssemblyRename : Task
  9. {
  10. [Required]
  11. // ReSharper disable once UnusedAutoPropertyAccessor.Global
  12. public ITaskItem[] Assemblies { get; set; }
  13. public override bool Execute()
  14. {
  15. foreach (ITaskItem assembly in Assemblies)
  16. {
  17. // ItemSpec holds the filename or path of an Item
  18. if (assembly.ItemSpec.Length > 0)
  19. {
  20. if (!File.Exists(assembly.ItemSpec))
  21. {
  22. Log.LogMessage(MessageImportance.Normal, "No file at " + assembly.ItemSpec);
  23. continue;
  24. }
  25. if (Path.GetExtension(assembly.ItemSpec) != ".dll")
  26. {
  27. Log.LogMessage(MessageImportance.Normal, assembly.ItemSpec + " not a DLL");
  28. continue;
  29. }
  30. try
  31. {
  32. Log.LogMessage(MessageImportance.Normal, "Reading " + assembly.ItemSpec);
  33. var module = ModuleDefinition.ReadModule(assembly.ItemSpec);
  34. var asmName = module.Assembly.Name;
  35. var name = asmName.Name;
  36. var version = asmName.Version;
  37. var newFilen = $"{name}.{version}.dll";
  38. var newFilePath = Path.Combine(Path.GetDirectoryName(assembly.ItemSpec) ?? throw new InvalidOperationException(), newFilen);
  39. Log.LogMessage(MessageImportance.Normal, $"Old file: {assembly.ItemSpec}, new file: {newFilePath}");
  40. if (File.Exists(newFilePath))
  41. File.Delete(newFilePath);
  42. File.Move(assembly.ItemSpec, newFilePath);
  43. }
  44. catch (Exception e)
  45. {
  46. Log.LogErrorFromException(e);
  47. }
  48. }
  49. }
  50. return !Log.HasLoggedErrors;
  51. }
  52. }
  53. }