Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
d146431
Add MSBuild.Coordinator exe project
DustinCampbell Apr 13, 2026
efd5fda
Add missing Microsoft.IO.Redist package reference to Framework
DustinCampbell Apr 24, 2026
21ad7f0
Add MSBuild.Coordinator.UnitTests project
DustinCampbell Apr 14, 2026
b384e1c
Add coordinator protocol types and tests
DustinCampbell Apr 17, 2026
4b2cdda
Add coordinator server with fair-share node budget management
DustinCampbell Apr 17, 2026
cfd43a5
Add CoordinatorClient for BuildManager integration
DustinCampbell Apr 22, 2026
8d0e2d9
Add tracing for coordinator client and server
DustinCampbell Apr 22, 2026
eab2916
Move NamedPipeUtil.cs to Framework and use in Protocol
DustinCampbell Apr 24, 2026
d1011c0
Add integration tests and pipe name isolation for coordinator
DustinCampbell Apr 24, 2026
e79fd55
Use platform-specific pipe names in coordinator unit tests
DustinCampbell Apr 24, 2026
d727075
Refactor coordinator message read/write into base class pattern
DustinCampbell Apr 27, 2026
f5fd21e
Use FrameworkErrorUtilities for protocol error handling
DustinCampbell Apr 27, 2026
c42f00e
Consolidate coordinator configuration into CoordinatorSettings class
DustinCampbell Apr 28, 2026
7925a59
Wait for client handlers to complete on CoordinatorServer shutdown
DustinCampbell Apr 28, 2026
ddcd043
Fix race condition in CoordinatorClient heartbeat disposal
DustinCampbell Apr 28, 2026
824c508
Clean up NodeBudgetManager a bit
DustinCampbell Apr 28, 2026
d704afe
Fix reconnection race condition and improve locking in CoordinatorServer
DustinCampbell Apr 28, 2026
3be0b52
Move coordinator env var names from Protocol to Traits
DustinCampbell Apr 29, 2026
8debfa2
Add MSBuild-Coordinator.md architecture document
DustinCampbell Apr 29, 2026
bf74d87
Add string polyfills and optimize escaping allocation path
DustinCampbell May 5, 2026
e3be85f
Fix Unix coordinator startup by using a path-safe mutex name
DustinCampbell May 5, 2026
204371e
Fix incorrect MSBuild.Coordinator path in MSBuild.SourceBuild.slnf
DustinCampbell May 5, 2026
d0e6a27
CR Feedback: Allow concurrent access in RunAsync
DustinCampbell May 6, 2026
eb52c7a
CR Feedback: Wait for in-flight callbacks to complete on Dispose
DustinCampbell May 6, 2026
52fa047
CR Feedback: Clamp values and avoid overflow in CoordinatorSettings
DustinCampbell May 6, 2026
5d6ebee
CR Feedback: Dispose connection and set to null when grant released
DustinCampbell May 6, 2026
bec832b
CR Feedback: Validate RequestNodesMessage values
DustinCampbell May 6, 2026
46b2060
CR Feedback: TryGrant should guard against invalid requests
DustinCampbell May 6, 2026
aa1ecb5
CR Feedback: BuildGrant should validate arguments
DustinCampbell May 6, 2026
7df6947
CR Feedback: Send heartbeats while waiting for server response
DustinCampbell May 6, 2026
2b5d7c8
Tweak formatting in src/MSBuild.Coordinator/Program.cs slightly
DustinCampbell May 6, 2026
ddb6d46
Update MSBuild-Coordinator.md for clarity and correctness
DustinCampbell May 6, 2026
1266a32
Merge branch 'main' into build-coordinator
DustinCampbell May 6, 2026
eb4d57b
Tweak note in MSBuild-Coordinator.md
DustinCampbell May 6, 2026
a46b540
Update note on node grant behavior in MSBuild
DustinCampbell May 6, 2026
fc3a44b
Merge branch 'main' into build-coordinator
DustinCampbell May 6, 2026
803cb7d
Merge branch 'main' into build-coordinator
DustinCampbell May 7, 2026
68d78f2
Merge branch 'main' into build-coordinator
DustinCampbell May 14, 2026
672f241
Merge branch 'main' into build-coordinator
DustinCampbell May 15, 2026
3d690f4
Merge branch 'main' into build-coordinator
DustinCampbell May 18, 2026
bdb044b
Merge branch 'main' into build-coordinator
DustinCampbell May 19, 2026
33c8c09
Merge branch 'main' into build-coordinator
DustinCampbell May 20, 2026
e8da1e7
Log coordinator status messages through MSBuild logging system
DustinCampbell May 20, 2026
3da15cd
Clean up: Add XML doc comments and reorder members in coordinator
DustinCampbell May 20, 2026
5e0069d
Rename "Server:" log prefix to "CoordinatorServer:" for consistency
DustinCampbell May 20, 2026
dd62b6c
Serialize coordinator launches with a named mutex
DustinCampbell May 20, 2026
d6cf2f4
Merge branch 'main' into build-coordinator
DustinCampbell May 21, 2026
34418c6
Improve CoordinatorClient diagnostic output
DustinCampbell May 21, 2026
960a73e
Move coordinator message types to Messages subfolder
DustinCampbell May 21, 2026
79171ef
Track wait duration when coordinator defers node grant
DustinCampbell May 21, 2026
efa1b62
Report coordinator wait duration in build telemetry
DustinCampbell May 21, 2026
744f687
Merge branch 'main' into build-coordinator
DustinCampbell May 21, 2026
c005655
Merge branch 'main' into build-coordinator
DustinCampbell Jun 11, 2026
07f8425
Refactor CoordinatorIntegration_Tests and add async bootstrap helper
DustinCampbell Jun 11, 2026
880ba91
Add coordinator server telemetry using MSBuild's activity infrastructure
DustinCampbell Jun 11, 2026
8500427
Merge branch 'main' into build-coordinator
DustinCampbell Jun 12, 2026
f9fe12f
Update ReadGuid/WriteGuid extension methods for BinaryReader/BinaryWr…
DustinCampbell Jun 12, 2026
d024c66
Add ConnectionId to coordinator protocol for unique client identifica…
DustinCampbell Jun 12, 2026
a8018a3
Make NodeBudgetManager thread-safe internally
DustinCampbell Jun 12, 2026
2cab812
Remove low-value resx comments from coordinator strings
DustinCampbell Jun 12, 2026
9543259
Move coordinator configuration constants to dedicated Constants class
DustinCampbell Jun 12, 2026
f41ab30
Specify explicit file extensions for coordinator bootstrap copies
DustinCampbell Jun 12, 2026
56464da
Replace version byte with capabilities handshake protocol
DustinCampbell Jun 12, 2026
4081564
Handle ErrorMessage in coordinator client and log all failure paths
DustinCampbell Jun 12, 2026
608e747
Consistent ownership transfer in TryNegotiate
DustinCampbell Jun 12, 2026
1b55649
Extract TrySendHandshake from TryNegotiate
DustinCampbell Jun 12, 2026
51f7105
Reduce cold-start latency in coordinator client
DustinCampbell Jun 12, 2026
bc9f13a
Fix misleading test names in CoordinatorClient_Tests
DustinCampbell Jun 13, 2026
4d9cb8d
Document how requested node count is determined
DustinCampbell Jun 13, 2026
1246e08
Update coordinator documentation for accuracy
DustinCampbell Jun 13, 2026
ab0d220
Rename ICoordinatorOutput to ICoordinatorDebugOutput
DustinCampbell Jun 13, 2026
3642612
Merge branch 'main' into build-coordinator
DustinCampbell Jun 13, 2026
69b2b35
Merge branch 'main' into build-coordinator
DustinCampbell Jun 16, 2026
709c4a3
Merge branch 'main' into build-coordinator
DustinCampbell Jun 16, 2026
f3edba5
Fix benign timer leak race in ResetShutdownTimer
DustinCampbell Jun 16, 2026
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: 2 additions & 0 deletions MSBuild.Dev.slnf
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
"src\\MSBuild.UnitTests\\Microsoft.Build.CommandLine.UnitTests.csproj",
"src\\MSBuild\\MSBuild.csproj",
"src\\MSBuild.Benchmarks\\MSBuild.Benchmarks.csproj",
"src\\MSBuild.Coordinator\\MSBuild.Coordinator.csproj",
"src\\MSBuild.Coordinator.UnitTests\\MSBuild.Coordinator.UnitTests.csproj",
"src\\StringTools\\StringTools.csproj",
"src\\Tasks.UnitTests\\Microsoft.Build.Tasks.UnitTests.csproj",
"src\\Tasks\\Microsoft.Build.Tasks.csproj",
Expand Down
1 change: 1 addition & 0 deletions MSBuild.SourceBuild.slnf
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"src\\Build\\Microsoft.Build.csproj",
"src\\Framework\\Microsoft.Build.Framework.csproj",
"src\\MSBuild\\MSBuild.csproj",
"src\\MSBuild.Coordinator\\MSBuild.Coordinator.csproj",
"src\\Package\\Localization\\Localization.csproj",
"src\\Tasks\\Microsoft.Build.Tasks.csproj",
"src\\Utilities\\Microsoft.Build.Utilities.csproj",
Expand Down
8 changes: 8 additions & 0 deletions MSBuild.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,14 @@
<Project Path="src/MSBuild.Bootstrap/MSBuild.Bootstrap.csproj">
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="src/MSBuild.Coordinator.UnitTests/MSBuild.Coordinator.UnitTests.csproj" Id="a6947a1c-6f87-47de-a23f-519b9e05af47">
<Platform Solution="*|ARM64" Project="arm64" />
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="src/MSBuild.Coordinator/MSBuild.Coordinator.csproj" Id="96b6c6a6-8219-4c15-b296-c30c6222ca02">
<Platform Solution="*|ARM64" Project="arm64" />
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="src/MSBuild.EndToEnd.Tests/Microsoft.Build.EndToEnd.Tests.csproj">
<Platform Solution="*|x64" Project="x64" />
</Project>
Expand Down
308 changes: 308 additions & 0 deletions documentation/MSBuild-Coordinator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,308 @@
# MSBuild Build Coordinator: Architecture and Flow

> **Important Note:** This document describes the architecture and design of the MSBuild Build Coordinator at a high level.
> For current implementation details, class structures, method signatures, or specific code patterns, always consult the source code directly.
> This ensures you're working with accurate, up-to-date information.

## Overview

The **MSBuild Build Coordinator** is a resource management system that orchestrates and enforces fair-share allocation of build nodes across multiple simultaneous MSBuild processes. It prevents system resource exhaustion by maintaining a global node budget and dynamically distributing available nodes among competing builds.

### Purpose

When multiple MSBuild processes run concurrently (common in CI/CD environments, distributed builds, or user multi-tasking), each process could independently attempt to spawn the maximum number of nodes, leading to:
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated
- System resource exhaustion
- Excessive memory consumption
- CPU contention and slowdown
- Reduced overall build throughput

The coordinator solves this by:
1. **Enforcing a global node budget** (defaults to processor count)
Comment thread
DustinCampbell marked this conversation as resolved.
2. **Implementing fair-share allocation** to distribute available nodes fairly
3. **Monitoring build health** via periodic heartbeats
4. **Auto-shutting down** after a timeout period

---

## Architecture Overview

```
┌──────────────────────────────────────────────────────────────────┐
│ System with Multiple Builds │
└──────────────────────────────────────────────────────────────────┘

Build 1 Build 2 Build 3
│ │ │
│ RequestNodes(4) │ RequestNodes(4) │ RequestNodes(4)
│ │ │
└─────────────────────┼─────────────────────┘
(via Named Pipes - IPC)
┌────────────────────────────────────┐
│ MSBuild Build Coordinator │
│ │
│ ┌──────────────────────────────┐ │
│ │ Node Budget Manager │ │
│ │ • Total Budget: 8 nodes │ │
│ │ • Allocated: 8 │ │
│ │ • Available: 0 │ │
│ └──────────────────────────────┘ │
│ │
│ ┌──────────────────────────────┐ │
│ │ Active Builds │ │
│ │ • Build 1: 4 nodes │ │
│ │ • Build 2: 4 nodes │ │
│ └──────────────────────────────┘ │
│ │
│ ┌──────────────────────────────┐ │
│ │ Waiting Builds Queue │ │
│ │ • Build 3: waiting │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
↓ ↓
Grant(nodes=2) Wait(queued)
```

---

## Component Architecture

### Key Components

**Coordinator Server** ([src/MSBuild.Coordinator/](src/MSBuild.Coordinator/))
- `CoordinatorServer.cs` - Main server that listens for client connections via named pipe
- `NodeBudgetManager.cs` - Implements node allocation and fair-share logic
- `ClientConnection.cs` - Manages individual client connections
- `BuildGrant.cs` - Represents a node allocation to a build
- `Program.cs` - Server launcher and singleton instance management

**Client-Side** ([src/Build/BackEnd/BuildManager/](src/Build/BackEnd/BuildManager/))
- `CoordinatorClient.cs` - Client connection handler integrated into BuildManager
- `BuildManager.cs` - Requests nodes from coordinator and sets build parallelism

**Protocol** ([src/Framework/Coordinator/](src/Framework/Coordinator/))
- Message types: `RequestNodesMessage`, `HeartbeatMessage`, `ReleaseNodesMessage`, `NodeGrantMessage`, `WaitMessage`, `ErrorMessage`
- `CoordinatorSettings.cs` - Configuration management
- `Protocol.cs` - Protocol versioning

### Directory Structure

```
src/
├── MSBuild.Coordinator/ # Coordinator server executable
│ ├── CoordinatorServer.cs
│ ├── NodeBudgetManager.cs
│ ├── ClientConnection.cs
│ ├── BuildGrant.cs
│ ├── Program.cs
│ └── ...
├── Framework/Coordinator/ # Protocol and interfaces
│ ├── RequestNodesMessage.cs
│ ├── HeartbeatMessage.cs
│ ├── ReleaseNodesMessage.cs
│ ├── NodeGrantMessage.cs
│ ├── WaitMessage.cs
│ ├── ErrorMessage.cs
│ ├── CoordinatorSettings.cs
│ ├── Protocol.cs
│ └── ...
├── Build/BackEnd/BuildManager/
│ ├── BuildManager.cs
│ ├── CoordinatorClient.cs
│ └── ...
└── MSBuild.Coordinator.UnitTests/
├── CoordinatorServerTests.cs
├── NodeBudgetManagerTests.cs
└── ...
```

---

## Communication Protocol

### Message Types

The coordinator uses a binary protocol with six message types:

**Client → Server:**
- `RequestNodesMessage` - Sent when a build starts, requests a node grant
- `HeartbeatMessage` - Periodic keep-alive message (default: every 5 seconds)
- `ReleaseNodesMessage` - Sent when build completes, releases allocated nodes

**Server → Client:**
- `NodeGrantMessage` - Grants nodes to a build
- `WaitMessage` - Indicates build is queued, no nodes immediately available
- `ErrorMessage` - Indicates an error condition (e.g., protocol version mismatch)

Each message includes a protocol version for compatibility verification.

**Source:** [src/Framework/Coordinator/](src/Framework/Coordinator/)

### Message Flow Example

```
Successful Grant:
Build → RequestNodesMessage(4)
Build ← NodeGrantMessage(4)
Build → Heartbeat (every 5s)
Build → ReleaseNodesMessage (on completion)

Build Queued:
Build → RequestNodesMessage(4)
Build ← WaitMessage (queue position 1)
Build → Heartbeat (every 5s while waiting)
Eventually: Build ← NodeGrantMessage(2) [after fair-share calculation]
```

---

## Fair-Share Allocation Algorithm

### Core Concept

When multiple builds compete for limited nodes, the coordinator distributes them fairly using:

```
fair_share = max(1, available_nodes / (waiting_builds + 1))
Comment thread
DustinCampbell marked this conversation as resolved.
```

This ensures:
- Every waiting build gets at least 1 node
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated
- Available nodes are divided equally among contenders
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated
- Nodes are processed from the wait queue as they become available

### Example Scenarios

**Two Competing Builds** (8 total nodes)
- Build A gets 4 nodes (active)
- Build B requests 4 nodes → Available: 4, Waiting: 1
- Fair share: max(1, 4 / 2) = 2 nodes
- Build B granted 2 nodes

**Multiple Builds in Queue** (8 total nodes)
- Build A uses 4 nodes
- Build B waiting (wants 6) and Build C waiting (wants 8)
- When A completes: 4 nodes available, 2 waiting
- Build B: fair_share = max(1, 4 / 2) = 2 nodes
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated
- Build C: fair_share = max(1, 2 / 1) = 2 nodes
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated

---

## Integration with BuildManager

### How Coordination Works

During build initialization:

1. BuildManager checks if `MSBUILDUSECOORDINATOR` environment variable is set
2. If enabled, `CoordinatorClient` attempts to connect to the coordinator
3. Sends `RequestNodesMessage` with desired node count
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated
Comment thread
AR-May marked this conversation as resolved.
Outdated
4. Receives either `NodeGrantMessage` (nodes granted) or `WaitMessage` (queued)
5. Updates build's maximum node count based on grant
6. During execution, spawns build nodes limited by this capped value
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated
7. On completion, sends `ReleaseNodesMessage` to free nodes for other builds

**Key Principle:** The coordinator is entirely optional. If it's unavailable or disabled, the build uses its requested node count without coordination.

**Sources:**
- [src/Build/BackEnd/BuildManager/BuildManager.cs](src/Build/BackEnd/BuildManager/BuildManager.cs)
- [src/Build/BackEnd/BuildManager/CoordinatorClient.cs](src/Build/BackEnd/BuildManager/CoordinatorClient.cs)
- [src/Framework/Traits.cs](src/Framework/Traits.cs) - Enablement logic

---

## Configuration and Environment Variables

### Environment Variables

| Variable | Default | Purpose |
|----------|---------|---------|
| `MSBUILDUSECOORDINATOR` | (empty) | Enable coordinator (set to any value to enable) |
Comment thread
DustinCampbell marked this conversation as resolved.
| `MSBUILDCOORDINATORPIPENAME` | `msbuild-coordinator-{UserName}` | Override default pipe name |
| `MSBUILDCOORDINATORNODEBUDGET` | Processor count | Override total node budget |
| `MSBUILDCOORDINATORHEARTBEAT` | 5000 | Override heartbeat interval (ms) |
| `MSBUILDCOORDINATORSHUTDOWNTIMEOUT` | 60000 | Override shutdown timeout (ms) |

---

## Lifecycle and Operation

### Coordinator Startup

1. When first MSBuild process needs coordination, it attempts to start the coordinator
2. Coordinator uses a system-wide mechanism to ensure only one instance runs
3. If an instance already exists, the new process connects as a client instead
4. Coordinator listens on a named pipe for client connections

**Source:** [src/MSBuild.Coordinator/Program.cs](src/MSBuild.Coordinator/Program.cs)

### Heartbeat Monitoring

The coordinator detects stalled or crashed clients through periodic heartbeats:

- Clients send heartbeat messages at configured intervals (default: 5 seconds)
- Coordinator tracks missed heartbeats
- After threshold is reached (default: 3 misses = 15 seconds), client is considered stalled
- Coordinator automatically releases nodes allocated to stalled client
- Waiting builds can then be granted those nodes

**Source:** [src/MSBuild.Coordinator/CoordinatorServer.cs](src/MSBuild.Coordinator/CoordinatorServer.cs)

### Graceful Shutdown

When a build completes normally:

1. Client sends `ReleaseNodesMessage` with its grant ID
2. Coordinator frees those nodes
3. Processes waiting queue to allocate freed nodes to waiting builds
4. If no active or waiting clients remain, coordinator enters timeout mode
5. After 60 seconds of inactivity, coordinator exits
Comment thread
DustinCampbell marked this conversation as resolved.

**Source:** [src/MSBuild.Coordinator/CoordinatorServer.cs](src/MSBuild.Coordinator/CoordinatorServer.cs)

---

## Error Handling

### Resilient Design

The coordinator system is designed to be fully optional:

- **Unavailable coordinator** → Build proceeds without coordination using full node count
- **Connection failure** → Build proceeds independently
- **Protocol mismatch** → Graceful fallback to unlimited nodes
- **Crashed client** → Detected via heartbeat timeout, resources cleaned up
- **Coordinator crash** → Next build can launch new instance

This means coordinator failures never block or degrade build execution—they only disable coordination.

**Sources:**
- [src/Build/BackEnd/BuildManager/CoordinatorClient.cs](src/Build/BackEnd/BuildManager/CoordinatorClient.cs)
- [src/MSBuild.Coordinator/CoordinatorServer.cs](src/MSBuild.Coordinator/CoordinatorServer.cs)

---

## Testing

### Unit Tests

Comprehensive test coverage in [src/MSBuild.Coordinator.UnitTests/](src/MSBuild.Coordinator.UnitTests/):

- Protocol serialization/deserialization
- Node budget manager allocation logic
- Fair-share algorithm correctness
- Heartbeat monitoring
- Multi-build coordination scenarios
- Error conditions and edge cases

---

## Source Code References

For detailed implementation information, refer to:

- **Server Implementation:** `src/MSBuild.Coordinator/`
- **Protocol Definitions:** `src/Framework/Coordinator/`
- **Client Integration:** `src/Build/BackEnd/BuildManager/`
- **Configuration:** `src/Framework/Traits.cs`, `src/Framework/Coordinator/CoordinatorSettings.cs`
- **Tests:** `src/MSBuild.Coordinator.UnitTests/`
12 changes: 12 additions & 0 deletions eng/BootStrapMsBuild.targets
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@
<FreshlyBuiltBinaries Include="$(MSBuildTaskHostBinPath)**\*.pdb" />
<FreshlyBuiltBinaries Include="$(MSBuildTaskHostBinPath)**\*.exe.config" />
<FreshlyBuiltBinaries Include="$(MSBuildTaskHostBinPath)**\*.dll.config" />

<!-- Only copy the coordinator's own binaries; transitive dependencies (e.g. Microsoft.IO.Redist)
are already provided by the Bootstrap/MSBuild output. -->
<FreshlyBuiltBinaries Include="$(CoordinatorBinPath)**\MSBuild.Coordinator.*" />
Comment thread
DustinCampbell marked this conversation as resolved.
Outdated

<FreshlyBuiltBinariesx64 Include="$(X64BinPath)**\*.dll" />
<FreshlyBuiltBinariesx64 Include="$(X64BinPath)**\*.exe" />
Expand All @@ -126,6 +130,8 @@
<FreshlyBuiltBinariesx64 Include="$(MSBuildTaskHostX64BinPath)**\*.pdb" />
<FreshlyBuiltBinariesx64 Include="$(MSBuildTaskHostX64BinPath)**\*.exe.config" />
<FreshlyBuiltBinariesx64 Include="$(MSBuildTaskHostX64BinPath)**\*.dll.config" />

<FreshlyBuiltBinariesx64 Include="$(CoordinatorX64BinPath)**\MSBuild.Coordinator.*" />

<FreshlyBuiltBinariesArm64 Include="$(X64BinPath)\Microsoft.Build.Tasks.Core.dll" />
<FreshlyBuiltBinariesArm64 Include="$(X64BinPath)\Microsoft.Build.dll" />
Expand All @@ -134,6 +140,8 @@
<FreshlyBuiltBinariesArm64 Include="$(Arm64BinPath)**\*.pdb" />
<FreshlyBuiltBinariesArm64 Include="$(Arm64BinPath)**\*.exe.config" />
<FreshlyBuiltBinariesArm64 Include="$(Arm64BinPath)**\*.dll.config" />

<FreshlyBuiltBinariesArm64 Include="$(CoordinatorArm64BinPath)**\MSBuild.Coordinator.*" />

<FreshlyBuiltRootProjects Include="$(OutputPath)Microsoft.Common.props" />
<FreshlyBuiltRootProjects Include="$(OutputPath)Microsoft.VisualStudioVersion.*.Common.props" />
Expand Down Expand Up @@ -238,6 +246,7 @@

<PropertyGroup>
<InstallDir>$(ArtifactsBinDir)bootstrap\core\</InstallDir>
<CoordinatorBinPath>$(ArtifactsBinDir)MSBuild.Coordinator\$(Configuration)\$(TargetFramework.ToLowerInvariant())\</CoordinatorBinPath>
</PropertyGroup>

<InstallDotNetCoreTask DotNetInstallScriptRootPath="$(DotNetRoot)" InstallDir="$(InstallDir)" Version="$(BootstrapSdkVersion)"/>
Expand All @@ -248,6 +257,9 @@
<ItemGroup>
<!-- *.deps.json are excluded because the SDK rewrites these files for consistency with the rest of the SDK, so take their version. -->
<FreshlyBuiltNetBinaries Include="$(OutDir)**\*.*" Exclude="$(OutDir)**\*.deps.json" />
<FreshlyBuiltNetBinaries Include="$(CoordinatorBinPath)**\*.dll" />
<FreshlyBuiltNetBinaries Include="$(CoordinatorBinPath)**\*.exe" />
<FreshlyBuiltNetBinaries Include="$(CoordinatorBinPath)**\*.runtimeconfig.json" />
</ItemGroup>

<!-- The copying of these dependencies is required by bootstrap\**\sdk\**\NuGet.RestoreEx.targets. Otherwise NuGet.Build.Tasks.dll can not be found. -->
Expand Down
1 change: 1 addition & 0 deletions src/Build/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
[assembly: InternalsVisibleTo("Microsoft.Build.UnitTests.Shared, PublicKey=002400000480000094000000060200000024000052534131000400000100010015c01ae1f50e8cc09ba9eac9147cf8fd9fce2cfe9f8dce4f7301c4132ca9fb50ce8cbf1df4dc18dd4d210e4345c744ecb3365ed327efdbc52603faa5e21daa11234c8c4a73e51f03bf192544581ebe107adee3a34928e39d04e524a9ce729d5090bfd7dad9d10c722c0def9ccc08ff0a03790e48bcd1f9b6c476063e1966a1c4")]
[assembly: InternalsVisibleTo("Microsoft.Build.Tasks.Cop, PublicKey=002400000480000094000000060200000024000052534131000400000100010015c01ae1f50e8cc09ba9eac9147cf8fd9fce2cfe9f8dce4f7301c4132ca9fb50ce8cbf1df4dc18dd4d210e4345c744ecb3365ed327efdbc52603faa5e21daa11234c8c4a73e51f03bf192544581ebe107adee3a34928e39d04e524a9ce729d5090bfd7dad9d10c722c0def9ccc08ff0a03790e48bcd1f9b6c476063e1966a1c4")]
[assembly: InternalsVisibleTo("Microsoft.Build.BuildCheck.UnitTests, PublicKey=002400000480000094000000060200000024000052534131000400000100010015c01ae1f50e8cc09ba9eac9147cf8fd9fce2cfe9f8dce4f7301c4132ca9fb50ce8cbf1df4dc18dd4d210e4345c744ecb3365ed327efdbc52603faa5e21daa11234c8c4a73e51f03bf192544581ebe107adee3a34928e39d04e524a9ce729d5090bfd7dad9d10c722c0def9ccc08ff0a03790e48bcd1f9b6c476063e1966a1c4")]
[assembly: InternalsVisibleTo("MSBuild.Coordinator.UnitTests, PublicKey=002400000480000094000000060200000024000052534131000400000100010015c01ae1f50e8cc09ba9eac9147cf8fd9fce2cfe9f8dce4f7301c4132ca9fb50ce8cbf1df4dc18dd4d210e4345c744ecb3365ed327efdbc52603faa5e21daa11234c8c4a73e51f03bf192544581ebe107adee3a34928e39d04e524a9ce729d5090bfd7dad9d10c722c0def9ccc08ff0a03790e48bcd1f9b6c476063e1966a1c4")]
// DO NOT expose Internals to "Microsoft.Build.UnitTests.OM.OrcasCompatibility" as this assembly is supposed to only see public interface

// This will enable passing the SafeDirectories flag to any P/Invoke calls/implementations within the assembly,
Expand Down
Loading
Loading