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.

73 lines
2.6 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. module.Dispose();
  40. Log.LogMessage(MessageImportance.Normal, $"Old file: {assembly.ItemSpec}, new file: {newFilePath}");
  41. if (File.Exists(newFilePath))
  42. File.Delete(newFilePath);
  43. Log.LogMessage(MessageImportance.Normal, "Moving");
  44. try
  45. {
  46. File.Move(assembly.ItemSpec, newFilePath);
  47. }
  48. catch (Exception)
  49. {
  50. File.Copy(assembly.ItemSpec, newFilePath);
  51. File.Delete(assembly.ItemSpec);
  52. }
  53. }
  54. catch (Exception e)
  55. {
  56. Log.LogErrorFromException(e);
  57. }
  58. }
  59. }
  60. return !Log.HasLoggedErrors;
  61. }
  62. }
  63. }