Skip to content
Merged
Changes from all commits
Commits
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
49 changes: 13 additions & 36 deletions src/MSBuildLocator/MSBuildLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ public static class MSBuildLocator
"Microsoft.Build.Framework",
"Microsoft.Build.Tasks.Core",
"Microsoft.Build.Utilities.Core",
"System.Runtime.CompilerServices.Unsafe",
"System.Numerics.Vectors"
};

#if NET46
Expand All @@ -36,9 +34,6 @@ public static class MSBuildLocator
private static Func<AssemblyLoadContext, AssemblyName, Assembly> s_registeredHandler;
#endif

// Used to determine when it's time to unregister the registeredHandler.
private static int numResolvedAssemblies;

/// <summary>
/// Gets a value indicating whether an instance of MSBuild is currently registered.
/// </summary>
Expand Down Expand Up @@ -173,7 +168,7 @@ public static void RegisterMSBuildPath(string msbuildPath)
}

// AssemblyResolve event can fire multiple times for the same assembly, so keep track of what's already been loaded.
var loadedAssemblies = new Dictionary<string, Assembly>(s_msBuildAssemblies.Length);
var loadedAssemblies = new Dictionary<string, Assembly>();

// Saving the handler in a static field so it can be unregistered later.
#if NET46
Expand All @@ -185,7 +180,7 @@ public static void RegisterMSBuildPath(string msbuildPath)

AppDomain.CurrentDomain.AssemblyResolve += s_registeredHandler;
#else
s_registeredHandler = (assemblyLoadContext, assemblyName) =>
s_registeredHandler = (_, assemblyName) =>
{
return TryLoadAssembly(assemblyName);
};
Expand All @@ -200,27 +195,19 @@ Assembly TryLoadAssembly(AssemblyName assemblyName)
// Assembly resolution is not thread-safe.
lock (loadedAssemblies)
{
Assembly assembly;
if (loadedAssemblies.TryGetValue(assemblyName.FullName, out assembly))
if (loadedAssemblies.TryGetValue(assemblyName.FullName, out Assembly assembly))
{
return assembly;
}

if (IsMSBuildAssembly(assemblyName))
// Look in the MSBuild folder for any unresolved reference. It may be a dependency
// of MSBuild or a task.
string targetAssembly = Path.Combine(msbuildPath, assemblyName.Name + ".dll");
if (File.Exists(targetAssembly))
{
var targetAssembly = Path.Combine(msbuildPath, assemblyName.Name + ".dll");
if (File.Exists(targetAssembly))
{
// Automatically unregister the handler once all supported assemblies have been loaded.
if (Interlocked.Increment(ref numResolvedAssemblies) == s_msBuildAssemblies.Length)
{
Unregister();
}

assembly = Assembly.LoadFrom(targetAssembly);
loadedAssemblies.Add(assemblyName.FullName, assembly);
return assembly;
}
assembly = Assembly.LoadFrom(targetAssembly);
loadedAssemblies.Add(assemblyName.FullName, assembly);
return assembly;
}

return null;
Expand All @@ -238,19 +225,9 @@ public static void Unregister()
{
if (!IsRegistered)
{
var error = $"{typeof(MSBuildLocator)}.{nameof(Unregister)} was called, but no MSBuild instance is registered." + Environment.NewLine;
if (numResolvedAssemblies == 0)
{
error += $"Ensure that {nameof(RegisterInstance)}, {nameof(RegisterMSBuildPath)}, or {nameof(RegisterDefaults)} is called before calling this method.";
}
else
{
error += "Unregistration automatically occurs once all supported assemblies are loaded into the current AppDomain and so generally is not necessary to call directly.";
}

error += Environment.NewLine +
$"{nameof(IsRegistered)} should be used to determine whether calling {nameof(Unregister)} is a valid operation.";

var error = $"{typeof(MSBuildLocator)}.{nameof(Unregister)} was called, but no MSBuild instance is registered." + Environment.NewLine +
$"Ensure that {nameof(RegisterInstance)}, {nameof(RegisterMSBuildPath)}, or {nameof(RegisterDefaults)} is called before calling this method." + Environment.NewLine +
$"{nameof(IsRegistered)} should be used to determine whether calling {nameof(Unregister)} is a valid operation.";
throw new InvalidOperationException(error);
}

Expand Down