Fix compiler references when building inside VS (#54614)
authorViktor Hofer <viktor.hofer@microsoft.com>
Thu, 24 Jun 2021 14:46:39 +0000 (16:46 +0200)
committerGitHub <noreply@github.com>
Thu, 24 Jun 2021 14:46:39 +0000 (16:46 +0200)
commit458bb9efd1de6544aa2a1645ba699ef7e59889df
tree5b88bca14df4dc0557389842ee2dd8658859e4e8
parent2ac023c8e9df61fe4557212cbd13956042fb47c5
Fix compiler references when building inside VS (#54614)

If for a source project a contract project exists, then the contract project's TargetPath should be passed to the compiler. This is handled by the SDK by default when `ProduceReferenceAssembly` is true. As dotnet/runtime doesn't use the `ProduceReferenceAssembly` feature yet, a custom target adds the necessary `ReferenceAssembly` metadata to the `TargetPathWithTargetPlatformMoniker` item which then is transformed to references for the compiler. That works fine on the CLI as the `GetTargetPathWithTargetPlatformMoniker` target runs after the ProjectReference to the ContractProject is resolved and its target path is available.
Inside VS the target ordering is different and the `ResolvedMatchingContract` item was empty as the ProjectReference to the contract wasn't yet resolved. The fix for that is to add a dependency onto the `ResolveProjectReferences` target to guarantee that the `ResolvedMatchingContract` item is populated in time.

Noticed this when the build of System.ComponentModel.Composition.Registration failed because the implementation assembly of System.ComponentModel.Composition was passed to the compiler instead of the reference assembly.
eng/resolveContract.targets