때로는 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
.