Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
1eb3176
Hacky, untested binding redirect validation
Forgind Dec 15, 2021
ef86539
Revert "Hacky, untested binding redirect validation"
Forgind Dec 15, 2021
11d1b98
Use task to validate packages
Forgind Dec 15, 2021
ac03457
Add Source="Foo.cs"
Forgind Dec 15, 2021
288ecc9
Move code into separate task
Forgind Dec 15, 2021
08bd7b5
Make into full class
Forgind Dec 15, 2021
39731bc
Fix up task
Forgind Dec 15, 2021
29e7068
Fix app.config 🙂
Forgind Dec 15, 2021
45d54d4
Opt System.ValueTuple out
Forgind Dec 15, 2021
d0b8b5b
Revert "Opt System.ValueTuple out"
Forgind Dec 15, 2021
a389c1a
Specifically opt out S.ValueTuple
Forgind Dec 15, 2021
747aa87
Missed a quote
Forgind Dec 15, 2021
354316d
Use String.Equals?
Forgind Dec 16, 2021
5f77395
Move file existence check earlier
Forgind Dec 16, 2021
f2c30e5
Somewhat cleaner version
Forgind Dec 16, 2021
60274a2
Add explicit check for System.ValueTuple
Forgind Dec 16, 2021
c5583f7
Add copyright header
Forgind Dec 16, 2021
1e4a18e
Learn to use namespaces in XML
Forgind Dec 16, 2021
b75a202
Update src/MSBuild/MSBuild.csproj
Forgind Dec 17, 2021
cbb140d
Update src/MSBuild/MSBuild.csproj
Forgind Dec 17, 2021
70555c7
Update src/MSBuild/ValidateMSBuildPackageDependencyVersions.cs
Forgind Dec 17, 2021
42a582f
Add comment for ignored assemblies
Forgind Dec 17, 2021
1ecec1c
Merge branch 'validate-packages-match-binding-redirects' of https://g…
Forgind Dec 17, 2021
abf550f
Revert "Update src/MSBuild/MSBuild.csproj"
Forgind Dec 17, 2021
9099712
Revert "Update src/MSBuild/MSBuild.csproj"
Forgind Jan 5, 2022
0be049f
Stop batching
Forgind Jan 5, 2022
fe5159a
Update comment
Forgind Jan 5, 2022
a4f3b4c
Fix comment
Forgind Jan 6, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/MSBuild/MSBuild.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -330,4 +330,14 @@

</Target>

<UsingTask TaskName="ValidateMSBuildPackageDependencyVersions" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<Task>
<Code Source="ValidateMSBuildPackageDependencyVersions.cs" Language="cs" />
</Task>
</UsingTask>

<Target Name="ValidateMSBuildPackageDependencyVersions" BeforeTargets="AfterBuild" Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'" >
<ValidateMSBuildPackageDependencyVersions AppConfig="@(AppConfigWithTargetPath)" AssemblyPath="$(OutputPath)" />
</Target>

</Project>
64 changes: 64 additions & 0 deletions src/MSBuild/ValidateMSBuildPackageDependencyVersions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Xml;
namespace MSBuild
{
public class ValidateMSBuildPackageDependencyVersions : Task
{
[Required]
public string AppConfig { get; set; }
[Required]
public string AssemblyPath { get; set; }

// Microsoft.Build.Conversion.Core and Microsoft.Build.Engine are deprecated, but they're still used in VS for now. This project doesn't directly reference them, so they don't appear in its output directory.
// Microsoft.NET.StringTools uses API not available in net35, but since we need it to work for TaskHosts as well, there are simpler versions implemented for that. Ensure it's the right version.
// Microsoft.Activities.Build and XamlBuildTask are loaded within an AppDomain in the XamlBuildTask after having been loaded from the GAC elsewhere. See https://github.com/dotnet/msbuild/pull/856
private string[] assembliesToIgnore = { "Microsoft.Build.Conversion.Core", "Microsoft.NET.StringTools.net35", "Microsoft.Build.Engine", "Microsoft.Activities.Build", "XamlBuildTask" };

public override bool Execute()
{
XmlDocument doc = new XmlDocument();
doc.Load(AppConfig);
XmlNamespaceManager namespaceManager = new(doc.NameTable);
namespaceManager.AddNamespace("asm", "urn:schemas-microsoft-com:asm.v1");
bool foundSystemValueTuple = false;
foreach (XmlElement dependentAssemblyElement in doc.DocumentElement.SelectNodes("/configuration/runtime/asm:assemblyBinding/asm:dependentAssembly[asm:assemblyIdentity][asm:bindingRedirect]", namespaceManager))
{
string name = (dependentAssemblyElement.SelectSingleNode("asm:assemblyIdentity", namespaceManager) as XmlElement).GetAttribute("name");
string version = (dependentAssemblyElement.SelectSingleNode("asm:bindingRedirect", namespaceManager) as XmlElement).GetAttribute("newVersion");
if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(version) && !assembliesToIgnore.Contains(name, StringComparer.OrdinalIgnoreCase))
{
string path = Path.Combine(AssemblyPath, name + ".dll");
string assemblyVersion = AssemblyName.GetAssemblyName(path).Version.ToString();
if (!version.Equals(assemblyVersion))
{
// Ensure that the binding redirect is to the GAC version, but
// we still ship the version we explicitly reference to let
// API consumers bind to it at runtime.
// See https://github.com/dotnet/msbuild/issues/6976.
if (String.Equals(name, "System.ValueTuple", StringComparison.OrdinalIgnoreCase) && String.Equals(version, "4.0.0.0") && String.Equals(assemblyVersion, "4.0.3.0"))
{
foundSystemValueTuple = true;
}
else
{
Log.LogError($"Binding redirect for '{name}' redirects to a different version ({version}) than MSBuild ships ({assemblyVersion}).");
}
}
}
}
if (!foundSystemValueTuple)
{
Log.LogError("Binding redirect for 'System.ValueTuple' missing.");
}
return !Log.HasLoggedErrors;
}
}
}
2 changes: 1 addition & 1 deletion src/MSBuild/app.amd64.config
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
<!-- Redirects for assemblies redistributed by MSBuild (in the .vsix). -->
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.NET.StringTools" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
Expand Down
2 changes: 1 addition & 1 deletion src/MSBuild/app.config
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
<!-- Redirects for assemblies redistributed by MSBuild (in the .vsix). -->
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.NET.StringTools" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
Expand Down