using System; using System.Collections.Generic; using System.Linq; using System.Text; using Mono.Cecil; using Microsoft.Build.Utilities; using Microsoft.Build.Framework; using System.IO; namespace MSBuildTasks { public class AssemblyRename : Task { private ITaskItem[] assemblies; [Required] public ITaskItem[] Assemblies { get => assemblies; set => assemblies = value; } public override bool Execute() { foreach (ITaskItem assembly in Assemblies) { // ItemSpec holds the filename or path of an Item if (assembly.ItemSpec.Length > 0) { if (!File.Exists(assembly.ItemSpec)) { Log.LogMessage(MessageImportance.Normal, "No file at " + assembly.ItemSpec); continue; } if (Path.GetExtension(assembly.ItemSpec) != ".dll") { Log.LogMessage(MessageImportance.Normal, assembly.ItemSpec + " not a DLL"); continue; } try { Log.LogMessage(MessageImportance.Normal, "Reading " + assembly.ItemSpec); var module = ModuleDefinition.ReadModule(assembly.ItemSpec); var asmName = module.Assembly.Name; var name = asmName.Name; var version = asmName.Version; var newFilen = $"{name}.{version}.dll"; var newFilePath = Path.Combine(Path.GetDirectoryName(assembly.ItemSpec), newFilen); Log.LogMessage(MessageImportance.Normal, $"Old file: {assembly.ItemSpec}, new file: {newFilePath}"); if (File.Exists(newFilePath)) File.Delete(newFilePath); File.Move(assembly.ItemSpec, newFilePath); } catch (Exception e) { Log.LogErrorFromException(e); } } } return !Log.HasLoggedErrors; } } }