บางครั้งAutoGenerateBindingRedirects
ก็ไม่เพียงพอ (แม้กระทั่งกับGenerateBindingRedirectsOutputType
) การค้นหาThere was a conflict
รายการทั้งหมดและแก้ไขด้วยตนเองทีละรายการอาจเป็นเรื่องที่น่าเบื่อดังนั้นฉันจึงเขียนโค้ดขนาดเล็กที่แยกวิเคราะห์บันทึกผลลัพธ์และสร้างรายการให้คุณ (ทิ้งไปstdout
):
// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";
var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
Console.WriteLine("Processing line: {0}", line);
var lineComponents = line.Split('"');
if (lineComponents.Length < 2)
throw new FormatException("Unexpected conflict line component count");
var assemblySegment = lineComponents[1];
Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
var assemblyComponents = assemblySegment
.Split(",")
.Select(kv => kv.Trim())
.Select(kv => kv.Split("=")
.Last())
.ToArray();
if (assemblyComponents.Length != 4)
throw new FormatException("Unexpected conflict segment component count");
var assembly = assemblyComponents[0];
var version = assemblyComponents[1];
var culture = assemblyComponents[2];
var publicKeyToken = assemblyComponents[3];
Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}
Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);
เคล็ดลับ: ใช้MSBuild Binary และ Structured Log Viewerและสร้างการเปลี่ยนเส้นทางการเชื่อมโยงสำหรับความขัดแย้งในโครงการที่ส่งคำเตือนเท่านั้น (นั่นคือผ่านthere was a conflict
บรรทัดเหล่านั้นไปยังไฟล์ข้อความอินพุตสำหรับรหัสด้านบน [ AssemblyConflicts.txt
])