|
|
- using Microsoft.Build.Framework;
- using Microsoft.Build.Utilities;
- using Mono.Cecil;
- using System;
- using System.IO;
-
- namespace MSBuildTasks
- {
- public class AssemblyRename : Task
- {
-
- [Required]
- // ReSharper disable once UnusedAutoPropertyAccessor.Global
- public ITaskItem[] Assemblies { get; set; }
-
- 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) ?? throw new InvalidOperationException(), newFilen);
-
- module.Dispose();
-
- Log.LogMessage(MessageImportance.Normal, $"Old file: {assembly.ItemSpec}, new file: {newFilePath}");
-
- if (File.Exists(newFilePath))
- File.Delete(newFilePath);
-
- Log.LogMessage(MessageImportance.Normal, "Moving");
- try
- {
- File.Move(assembly.ItemSpec, newFilePath);
- }
- catch (Exception)
- {
- File.Copy(assembly.ItemSpec, newFilePath);
- File.Delete(assembly.ItemSpec);
- }
- }
- catch (Exception e)
- {
- Log.LogErrorFromException(e);
- }
- }
- }
-
- return !Log.HasLoggedErrors;
- }
- }
- }
|