Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RAR as a service - Node startup #5613

Merged
merged 75 commits into from
Sep 1, 2020
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
b487366
Adding MSBuild.Tasks to MSBuild
Jul 30, 2020
b7a7943
RAR node provider
Aug 5, 2020
58e07d7
RAR controller and client
Aug 5, 2020
5dc0367
References
Aug 5, 2020
3865c75
Merge remote-tracking branch 'ms/master' into rarAsService/node
Aug 5, 2020
55268c1
Chganes based on comment in PR review
Aug 6, 2020
e65c3f3
Merge remote-tracking branch 'ms/master' into rarAsService/node
Aug 6, 2020
5ebe6f7
PR comments
Aug 6, 2020
de63fce
Update src/Shared/CommunicationsUtilities.cs
ostorc Aug 6, 2020
ba9af0a
PR comments
Aug 6, 2020
331f113
Merge branch 'rarAsService/node' of https://github.com/ostorc/msbuild…
Aug 6, 2020
268b4d7
PR comments
Aug 10, 2020
332a5af
StremJsonRpc upgrade and json fix
Aug 12, 2020
be02cdf
Worker to Special (rename)
Aug 12, 2020
23cd78c
Merge remote-tracking branch 'ms/master' into rarAsService/node
Aug 12, 2020
356a33a
Build fix
Aug 12, 2020
f543437
Handshake validation
Aug 12, 2020
bd0a663
RAR shutdown on its own
Aug 12, 2020
d4a7d4f
Node startup reworked
Aug 13, 2020
80a9364
Small fixes
Aug 13, 2020
95bd354
PR comments
Aug 14, 2020
e0b4033
Merge branch 'master' into rarAsService/node
Aug 14, 2020
ef6555e
PR Comments
Aug 14, 2020
42d330a
extra commit
Forgind Aug 14, 2020
59a5df0
Typo
Aug 14, 2020
fd54e2e
Remove dummy method
Aug 14, 2020
6e16aef
ref
Aug 14, 2020
a64202a
Apply suggestions from code review
ostorc Aug 15, 2020
3b98023
Update src/Tasks/ResolveAssemblyReferences/RpcUtils.cs
ostorc Aug 15, 2020
bf74722
PR Comments
Aug 15, 2020
dfdd2d3
PR Comments
Aug 17, 2020
f940974
Merge branch 'master' into rarAsService/node
Aug 17, 2020
1836057
Version change
Aug 18, 2020
639cd58
Merge branch 'exp/rarAsService' of https://github.com/dotnet/msbuild …
Aug 18, 2020
55ad2b3
Missing dlls fix
Aug 20, 2020
5e13ec5
Merge branch 'rarAsService/node' into exp/rarAsService
Aug 20, 2020
8640658
FIX typo
Aug 20, 2020
d15f6bf
Signing
Aug 20, 2020
3dbeee1
Triger commit
Aug 20, 2020
c325a1f
extra commit
Aug 20, 2020
1ca36f2
Merge 'master' into 'rarAsService/node'
Aug 21, 2020
a0c2fc8
GetRarPipeName fix
Aug 21, 2020
0abc9cc
Fixes from exp branch
Aug 21, 2020
7c9379d
Missing files
Aug 21, 2020
9ab82b9
Merge branch 'rarAsService/node' into exp/rarAsService
Aug 21, 2020
d48a5a9
MessagePack signing
Aug 22, 2020
bf9abf8
Ngen priority
Aug 22, 2020
d26b3d2
Merge branch 'master' into rarAsService/node
Aug 24, 2020
28228cc
Remove Newtonsoft.Json dll
Aug 24, 2020
af35387
Remove binding redirect
Aug 24, 2020
192e0a2
Remove Tasks.Core dependency
Aug 26, 2020
93bfc4b
Fixed constructor
Aug 26, 2020
a305e82
Remove exe location from OutOfProcNode
Aug 26, 2020
9a27bb7
Logging
Aug 26, 2020
35e07f6
Small improvements
Aug 27, 2020
fe27706
Merge branch 'exp/rarInsertionTest' into rarAsService/node
Aug 27, 2020
326297f
Merge branch 'master' into rarAsService/node
Aug 27, 2020
438af4e
Whitespace fix
Aug 27, 2020
3880271
Apply suggestions from code review
ostorc Aug 30, 2020
7121093
Merge branch 'master' into rarAsService/node
Aug 30, 2020
7d615b0
PR comments fix
Aug 30, 2020
eed1b17
PR comments fix - method const to class constant
Aug 30, 2020
0a83e1d
PR comments
Aug 30, 2020
4500803
Moved string to resources
Aug 30, 2020
bb31424
Apply suggestions from code review
ostorc Aug 31, 2020
7fdac1b
Localization files
Aug 31, 2020
e08cbb8
Resources
Aug 31, 2020
5372f22
PR comments
Aug 31, 2020
f789e02
Build fix
Aug 31, 2020
4957c45
Add handshake validation to the RAR connection
Aug 31, 2020
0adb1cf
Add node expiration timeout
Aug 31, 2020
a5ac717
Missing ref files
Sep 1, 2020
3bceb4d
Apply suggestions from code review
ostorc Sep 1, 2020
c4e41e9
xlf files
Sep 1, 2020
d82b3f3
Typos and small refactoring
Sep 1, 2020
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
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
NU5125: Arcade uses licenseUrl when doing pack, which now causes NU5125 warning. This disables that warning until arcade can switch over.
-->

<NoWarn>$(NoWarn);NU1603;NU5105;NU5125;1701;1702</NoWarn>
<NoWarn>$(NoWarn);NU1603;NU5105;NU5125;1701;1702;VSTHRD002;VSTHRD105;VSTHRD110;VSTHRD200</NoWarn>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Debug-MONO'">
Expand Down
3 changes: 2 additions & 1 deletion eng/Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<PackageReference Update="Microsoft.Net.Compilers.Toolset" Version="$(MicrosoftNetCompilersToolsetVersion)" />
<PackageReference Update="Microsoft.VisualStudio.SDK.EmbedInteropTypes" Version="15.0.15" />
<PackageReference Update="Microsoft.VisualStudio.Setup.Configuration.Interop" Version="1.16.30" />
<PackageReference Update="Microsoft.Win32.Registry" Version="4.3.0" />
<PackageReference Update="Microsoft.Win32.Registry" Version="4.6.0" />
ostorc marked this conversation as resolved.
Show resolved Hide resolved
<PackageReference Update="NuGet.Build.Tasks" Version="$(NuGetBuildTasksVersion)" />
<PackageReference Update="NuGet.Frameworks" Version="$(NuGetBuildTasksVersion)" />
<PackageReference Update="PdbGit" Version="3.0.41" />
Expand Down Expand Up @@ -48,6 +48,7 @@
<PackageReference Update="xunit.assert" Version="$(XUnitVersion)" />
<PackageReference Update="xunit.console" Version="$(XUnitVersion)" />
<PackageReference Update="xunit.core" Version="$(XUnitVersion)" />
<PackageReference Update="StreamJsonRpc" Version="2.4.48" />
</ItemGroup>

<ItemGroup Condition="'$(DotNetBuildFromSource)' != 'true'">
Expand Down
16 changes: 16 additions & 0 deletions ref/Microsoft.Build.Tasks.Core/net/Microsoft.Build.Tasks.Core.cs
Original file line number Diff line number Diff line change
Expand Up @@ -940,6 +940,7 @@ public ResolveAssemblyReference() { }
public string TargetFrameworkVersion { get { throw null; } set { } }
public string TargetProcessorArchitecture { get { throw null; } set { } }
public bool UnresolveFrameworkAssembliesFromHigherFrameworks { get { throw null; } set { } }
public bool UseResolveAssemblyReferenceService { get { throw null; } set { } }
public string WarnOrErrorOnTargetArchitectureMismatch { get { throw null; } set { } }
public override bool Execute() { throw null; }
}
Expand Down Expand Up @@ -2543,6 +2544,21 @@ public partial interface IVbcHostObjectFreeThreaded
bool Compile();
}
}
namespace Microsoft.Build.Tasks.ResolveAssemblyReferences.Contract
ostorc marked this conversation as resolved.
Show resolved Hide resolved
{
public partial interface IResolveAssemblyReferenceTaskHandler : System.IDisposable
ostorc marked this conversation as resolved.
Show resolved Hide resolved
{
System.Threading.Tasks.Task<int> GetNumber(int parameter);
}
}
namespace Microsoft.Build.Tasks.ResolveAssemblyReferences.Server
{
public sealed partial class RarController
{
public RarController(string pipeName) { }
public System.Threading.Tasks.Task<int> StartAsync(System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken)) { throw null; }
ostorc marked this conversation as resolved.
Show resolved Hide resolved
ostorc marked this conversation as resolved.
Show resolved Hide resolved
}
}
namespace Microsoft.Build.Tasks.Xaml
{
public partial class CommandLineArgumentRelation : Microsoft.Build.Tasks.Xaml.PropertyRelation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,7 @@ public ResolveAssemblyReference() { }
public string TargetFrameworkVersion { get { throw null; } set { } }
public string TargetProcessorArchitecture { get { throw null; } set { } }
public bool UnresolveFrameworkAssembliesFromHigherFrameworks { get { throw null; } set { } }
public bool UseResolveAssemblyReferenceService { get { throw null; } set { } }
public string WarnOrErrorOnTargetArchitectureMismatch { get { throw null; } set { } }
public override bool Execute() { throw null; }
}
Expand Down Expand Up @@ -1045,3 +1046,18 @@ public partial interface IVbcHostObjectFreeThreaded
bool Compile();
}
}
namespace Microsoft.Build.Tasks.ResolveAssemblyReferences.Contract
{
public partial interface IResolveAssemblyReferenceTaskHandler : System.IDisposable
{
System.Threading.Tasks.Task<int> GetNumber(int parameter);
}
}
namespace Microsoft.Build.Tasks.ResolveAssemblyReferences.Server
{
public sealed partial class RarController
{
public RarController(string pipeName) { }
public System.Threading.Tasks.Task<int> StartAsync(System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken)) { throw null; }
}
}
8 changes: 8 additions & 0 deletions ref/Microsoft.Build/net/Microsoft.Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,7 @@ public enum NodeAffinity
Any = 2,
InProc = 0,
OutOfProc = 1,
RarNode = 3,
}
public enum NodeEngineShutdownReason
{
Expand All @@ -1107,6 +1108,7 @@ public enum NodeEngineShutdownReason
public partial class OutOfProcNode
{
public OutOfProcNode() { }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool enableReuse, bool lowPriority, bool workerNode, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool enableReuse, bool lowPriority, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool enableReuse, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
Expand Down Expand Up @@ -1382,6 +1384,12 @@ internal ProjectTaskOutputPropertyInstance() { }
public string TaskParameter { get { throw null; } }
public override Microsoft.Build.Construction.ElementLocation TaskParameterLocation { get { throw null; } }
}
public sealed partial class RarNode
{
public RarNode() { }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool nodeReuse, bool lowPriority, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
ostorc marked this conversation as resolved.
Show resolved Hide resolved
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
}
public partial class RequestedProjectState
{
public RequestedProjectState() { }
Expand Down
8 changes: 8 additions & 0 deletions ref/Microsoft.Build/netstandard/Microsoft.Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,7 @@ public enum NodeAffinity
Any = 2,
InProc = 0,
OutOfProc = 1,
RarNode = 3,
}
public enum NodeEngineShutdownReason
{
Expand All @@ -1101,6 +1102,7 @@ public enum NodeEngineShutdownReason
public partial class OutOfProcNode
{
public OutOfProcNode() { }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool enableReuse, bool lowPriority, bool workerNode, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool enableReuse, bool lowPriority, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool enableReuse, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
Expand Down Expand Up @@ -1376,6 +1378,12 @@ internal ProjectTaskOutputPropertyInstance() { }
public string TaskParameter { get { throw null; } }
public override Microsoft.Build.Construction.ElementLocation TaskParameterLocation { get { throw null; } }
}
public sealed partial class RarNode
{
public RarNode() { }
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(bool nodeReuse, bool lowPriority, out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
ostorc marked this conversation as resolved.
Show resolved Hide resolved
ostorc marked this conversation as resolved.
Show resolved Hide resolved
public Microsoft.Build.Execution.NodeEngineShutdownReason Run(out System.Exception shutdownException) { shutdownException = default(System.Exception); throw null; }
}
public partial class RequestedProjectState
{
public RequestedProjectState() { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public void RegisterDefaultFactories()

_componentEntriesByType[BuildComponentType.InProcNodeProvider] = new BuildComponentEntry(BuildComponentType.InProcNodeProvider, NodeProviderInProc.CreateComponent, CreationPattern.Singleton);
_componentEntriesByType[BuildComponentType.OutOfProcNodeProvider] = new BuildComponentEntry(BuildComponentType.OutOfProcNodeProvider, NodeProviderOutOfProc.CreateComponent, CreationPattern.Singleton);
_componentEntriesByType[BuildComponentType.OutOfProcNodeRarProvider] = new BuildComponentEntry(BuildComponentType.OutOfProcNodeRarProvider, NodeProviderOutOfProcRar.CreateComponent, CreationPattern.Singleton);
_componentEntriesByType[BuildComponentType.OutOfProcTaskHostNodeProvider] = new BuildComponentEntry(BuildComponentType.OutOfProcTaskHostNodeProvider, NodeProviderOutOfProcTaskHost.CreateComponent, CreationPattern.Singleton);

// PropertyCache,
Expand Down
7 changes: 6 additions & 1 deletion src/Build/BackEnd/Components/Communications/INodeProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,12 @@ internal enum NodeProviderType
/// <summary>
/// The provider provides remote nodes.
/// </summary>
Remote
Remote,

/// <summary>
/// The provider provides RAR nodes.
/// </summary>
ResolveAssemblyReference
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ internal class NodeEndpointOutOfProc : NodeEndpointOutOfProcBase

private readonly bool _lowPriority;

private readonly bool _workerNode;
ostorc marked this conversation as resolved.
Show resolved Hide resolved

#endregion

#region Constructors and Factories
Expand All @@ -33,16 +35,20 @@ internal class NodeEndpointOutOfProc : NodeEndpointOutOfProcBase
/// <param name="host">The component host.</param>
/// <param name="enableReuse">Whether this node may be reused for a later build.</param>
/// <param name="lowPriority">Whether this node is low priority.</param>
/// <param name="workerNode">Indicates if node is worker node (can accept normal MSBuild work)</param>
internal NodeEndpointOutOfProc(
string pipeName,
IBuildComponentHost host,
bool enableReuse,
bool lowPriority)
bool lowPriority,
bool workerNode)
{
ErrorUtilities.VerifyThrowArgumentNull(host, "host");
_componentHost = host;
_enableReuse = enableReuse;
_lowPriority = lowPriority;
_workerNode = workerNode;

ostorc marked this conversation as resolved.
Show resolved Hide resolved

InternalConstruct(pipeName);
}
Expand All @@ -54,7 +60,12 @@ internal NodeEndpointOutOfProc(
/// </summary>
protected override Handshake GetHandshake()
{
return new Handshake(CommunicationsUtilities.GetHandshakeOptions(taskHost: false, is64Bit: EnvironmentUtilities.Is64BitProcess, nodeReuse: _enableReuse, lowPriority: _lowPriority));
return new Handshake(CommunicationsUtilities.GetHandshakeOptions(
taskHost: false,
is64Bit: EnvironmentUtilities.Is64BitProcess,
nodeReuse: _enableReuse,
lowPriority: _lowPriority,
_workerNode));
}

#region Structs
Expand Down
22 changes: 22 additions & 0 deletions src/Build/BackEnd/Components/Communications/NodeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ internal class NodeManager : INodeManager
/// </summary>
private INodeProvider _outOfProcNodeProvider;


/// <summary>
/// The node provider for out-of-proc RAR nodes.
/// </summary>
private INodeProvider _outOfProcRarNodeProvider;

/// <summary>
/// The build component host.
/// </summary>
Expand Down Expand Up @@ -113,6 +119,11 @@ public NodeInfo CreateNode(NodeConfiguration configuration, NodeAffinity nodeAff
nodeId = AttemptCreateNode(_outOfProcNodeProvider, configuration);
}

if (nodeId == InvalidNodeId && nodeAffinity == NodeAffinity.RarNode)
{
nodeId = AttemptCreateNode(_outOfProcRarNodeProvider, configuration);
}

if (nodeId == InvalidNodeId)
{
return null;
Expand Down Expand Up @@ -166,6 +177,8 @@ public void ShutdownConnectedNodes(bool enableReuse)
{
_outOfProcNodeProvider.ShutdownConnectedNodes(enableReuse);
}

_outOfProcRarNodeProvider?.ShutdownConnectedNodes(enableReuse);
}

/// <summary>
Expand All @@ -178,6 +191,8 @@ public void ShutdownAllNodes()
{
_outOfProcNodeProvider.ShutdownAllNodes();
}

_outOfProcRarNodeProvider?.ShutdownAllNodes();
}

#endregion
Expand All @@ -196,6 +211,7 @@ public void InitializeComponent(IBuildComponentHost host)

_inProcNodeProvider = _componentHost.GetComponent(BuildComponentType.InProcNodeProvider) as INodeProvider;
_outOfProcNodeProvider = _componentHost.GetComponent(BuildComponentType.OutOfProcNodeProvider) as INodeProvider;
_outOfProcRarNodeProvider = _componentHost.GetComponent(BuildComponentType.OutOfProcNodeRarProvider) as INodeProvider;

_componentShutdown = false;

Expand All @@ -217,8 +233,14 @@ public void ShutdownComponent()
((IDisposable)_outOfProcNodeProvider).Dispose();
}

if (_outOfProcRarNodeProvider is IDisposable rarNodeProvider)
{
rarNodeProvider.Dispose();
}

_inProcNodeProvider = null;
_outOfProcNodeProvider = null;
_outOfProcRarNodeProvider = null;
_componentHost = null;
_componentShutdown = true;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,11 @@ public int AvailableNodes
/// </summary>
/// <param name="enableNodeReuse">Is reuse of build nodes allowed?</param>
/// <param name="enableLowPriority">Is the build running at low priority?</param>
internal static Handshake GetHandshake(bool enableNodeReuse, bool enableLowPriority)
/// <param name="workerNode">/Indicates if node can accept standard MSBuild work</param>
internal static Handshake GetHandshake(bool enableNodeReuse, bool enableLowPriority, bool workerNode)
{
CommunicationsUtilities.Trace("MSBUILDNODEHANDSHAKESALT=\"{0}\", msbuildDirectory=\"{1}\", enableNodeReuse={2}, enableLowPriority={3}", Traits.MSBuildNodeHandshakeSalt, BuildEnvironmentHelper.Instance.MSBuildToolsDirectory32, enableNodeReuse, enableLowPriority);
return new Handshake(CommunicationsUtilities.GetHandshakeOptions(taskHost: false, nodeReuse: enableNodeReuse, lowPriority: enableLowPriority, is64Bit: EnvironmentUtilities.Is64BitProcess));
return new Handshake(CommunicationsUtilities.GetHandshakeOptions(taskHost: false, nodeReuse: enableNodeReuse, lowPriority: enableLowPriority, workerNode: workerNode, is64Bit: EnvironmentUtilities.Is64BitProcess));
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Security.Principal;
using Task = System.Threading.Tasks.Task;

using Microsoft.Build.Eventing;
using Microsoft.Build.Exceptions;
Expand Down Expand Up @@ -124,13 +125,16 @@ protected void ShutdownAllNodes(bool nodeReuse, NodeContextTerminateDelegate ter
int timeout = 30;

// Attempt to connect to the process with the handshake without low priority.
Stream nodeStream = TryConnectToProcess(nodeProcess.Id, timeout, NodeProviderOutOfProc.GetHandshake(nodeReuse, false));
Stream nodeStream = TryConnectToProcess(nodeProcess.Id, timeout, NodeProviderOutOfProc.GetHandshake(nodeReuse, false, true));
ostorc marked this conversation as resolved.
Show resolved Hide resolved

if (null == nodeStream)
{
// If we couldn't connect attempt to connect to the process with the handshake including low priority.
nodeStream = TryConnectToProcess(nodeProcess.Id, timeout, NodeProviderOutOfProc.GetHandshake(nodeReuse, true));
}
// If we couldn't connect attempt to connect to the process with the handshake including low priority.
nodeStream ??= TryConnectToProcess(nodeProcess.Id, timeout, NodeProviderOutOfProc.GetHandshake(nodeReuse, true, true));

// Attempt to connect to the non-worker process
// Attempt to connect to the process with the handshake without low priority.
nodeStream ??= TryConnectToProcess(nodeProcess.Id, timeout, NodeProviderOutOfProc.GetHandshake(nodeReuse, false, false));
// If we couldn't connect attempt to connect to the process with the handshake including low priority.
nodeStream ??= TryConnectToProcess(nodeProcess.Id, timeout, NodeProviderOutOfProc.GetHandshake(nodeReuse, true, false));

if (null != nodeStream)
{
Expand Down Expand Up @@ -224,7 +228,7 @@ protected NodeContext GetNode(string msbuildLocation, string commandLineArgs, in
string taskHostNameForClr2TaskHost = Path.GetFileNameWithoutExtension(NodeProviderOutOfProcTaskHost.TaskHostNameForClr2TaskHost);
if (Path.GetFileNameWithoutExtension(msbuildLocation).Equals(taskHostNameForClr2TaskHost, StringComparison.OrdinalIgnoreCase))
{
if (FrameworkLocationHelper.GetPathToDotNetFrameworkV35(DotNetFrameworkArchitecture.Current) == null)
if (FrameworkLocationHelper.GetPathToDotNetFrameworkV35(Shared.DotNetFrameworkArchitecture.Current) == null)
ostorc marked this conversation as resolved.
Show resolved Hide resolved
{
CommunicationsUtilities.Trace
(
Expand Down
Loading