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;
|
|
}
|
|
}
|
|
}
|