in src/Tasks/Microsoft.NET.Build.Tasks/ResolveFrameworkReferences.cs [65:257]
protected override void ExecuteCore()
{
var knownFrameworkReferences = KnownFrameworkReferences.Select(item => new KnownFrameworkReference(item))
.Where(kfr => kfr.TargetFramework.Framework.Equals(TargetFrameworkIdentifier, StringComparison.OrdinalIgnoreCase) &&
NormalizeVersion(kfr.TargetFramework.Version) == NormalizeVersion(new Version(TargetFrameworkVersion)))
.ToDictionary(kfr => kfr.Name);
List<ITaskItem> packagesToDownload = new List<ITaskItem>();
List<ITaskItem> runtimeFrameworks = new List<ITaskItem>();
List<ITaskItem> targetingPacks = new List<ITaskItem>();
List<ITaskItem> runtimePacks = new List<ITaskItem>();
List<string> unresolvedFrameworkReferences = new List<string>();
string appHostPackPattern = null;
string appHostPackVersion = null;
string appHostRuntimeIdentifiers = null;
foreach (var frameworkReference in FrameworkReferences)
{
KnownFrameworkReference knownFrameworkReference;
if (knownFrameworkReferences.TryGetValue(frameworkReference.ItemSpec, out knownFrameworkReference))
{
if (!string.IsNullOrEmpty(knownFrameworkReference.AppHostPackNamePattern))
{
if (appHostPackPattern == null)
{
appHostPackPattern = knownFrameworkReference.AppHostPackNamePattern;
appHostPackVersion = knownFrameworkReference.LatestRuntimeFrameworkVersion;
appHostRuntimeIdentifiers = knownFrameworkReference.AppHostRuntimeIdentifiers;
}
else
{
throw new InvalidOperationException("Multiple FrameworkReferences defined an AppHostPack, which is not supposed to happen");
}
}
// Get the path of the targeting pack in the targeting pack root (e.g. dotnet/ref)
TaskItem targetingPack = new TaskItem(knownFrameworkReference.Name);
targetingPack.SetMetadata(MetadataKeys.PackageName, knownFrameworkReference.TargetingPackName);
targetingPack.SetMetadata(MetadataKeys.PackageVersion, knownFrameworkReference.TargetingPackVersion);
targetingPack.SetMetadata(MetadataKeys.RelativePath, "");
string targetingPackPath = null;
if (!string.IsNullOrEmpty(TargetingPackRoot))
{
targetingPackPath = GetPackPath(knownFrameworkReference.TargetingPackName, knownFrameworkReference.TargetingPackVersion);
}
if (targetingPackPath != null && Directory.Exists(targetingPackPath))
{
targetingPack.SetMetadata(MetadataKeys.Path, targetingPackPath);
targetingPack.SetMetadata(MetadataKeys.PackageDirectory, targetingPackPath);
}
else
{
// Download targeting pack
TaskItem packageToDownload = new TaskItem(knownFrameworkReference.TargetingPackName);
packageToDownload.SetMetadata(MetadataKeys.Version, knownFrameworkReference.TargetingPackVersion);
packagesToDownload.Add(packageToDownload);
}
targetingPacks.Add(targetingPack);
if (SelfContained && !string.IsNullOrEmpty(knownFrameworkReference.RuntimePackNamePatterns))
{
foreach (var runtimePackNamePattern in knownFrameworkReference.RuntimePackNamePatterns.Split(';'))
{
string runtimePackRuntimeIdentifier = GetBestRuntimeIdentifier(RuntimeIdentifier, knownFrameworkReference.RuntimePackRuntimeIdentifiers,
out bool wasInGraph);
if (runtimePackRuntimeIdentifier == null)
{
if (wasInGraph)
{
// NETSDK1082: There was no runtime pack for {0} available for the specified RuntimeIdentifier '{1}'.
Log.LogError(Strings.NoRuntimePackAvailable, knownFrameworkReference.Name, RuntimeIdentifier);
}
else
{
// NETSDK1083: The specified RuntimeIdentifier '{0}' is not recognized.
Log.LogError(Strings.UnsupportedRuntimeIdentifier, RuntimeIdentifier);
}
}
else
{
string runtimePackName = runtimePackNamePattern.Replace("**RID**", runtimePackRuntimeIdentifier);
TaskItem runtimePackItem = new TaskItem(runtimePackName);
runtimePackItem.SetMetadata(MetadataKeys.PackageName, runtimePackName);
runtimePackItem.SetMetadata(MetadataKeys.PackageVersion, knownFrameworkReference.LatestRuntimeFrameworkVersion);
runtimePackItem.SetMetadata("FrameworkReference", knownFrameworkReference.Name);
runtimePackItem.SetMetadata(MetadataKeys.RuntimeIdentifier, runtimePackRuntimeIdentifier);
runtimePacks.Add(runtimePackItem);
TaskItem packageToDownload = new TaskItem(runtimePackName);
packageToDownload.SetMetadata(MetadataKeys.Version, knownFrameworkReference.LatestRuntimeFrameworkVersion);
packagesToDownload.Add(packageToDownload);
}
}
}
TaskItem runtimeFramework = new TaskItem(knownFrameworkReference.RuntimeFrameworkName);
// Use default (non roll-forward) version for now. Eventually we'll need to add support for rolling
// forward, and for publishing assets from a runtime pack for self-contained apps
runtimeFramework.SetMetadata(MetadataKeys.Version, knownFrameworkReference.DefaultRuntimeFrameworkVersion);
runtimeFrameworks.Add(runtimeFramework);
}
else
{
unresolvedFrameworkReferences.Add(frameworkReference.ItemSpec);
}
}
if (appHostPackPattern != null && AppHostRuntimeIdentifier != null)
{
// Choose AppHost RID as best match of the specified RID
string bestAppHostRuntimeIdentifier = GetBestRuntimeIdentifier(AppHostRuntimeIdentifier, appHostRuntimeIdentifiers, out bool wasInGraph);
if (bestAppHostRuntimeIdentifier == null)
{
if (wasInGraph)
{
// NETSDK1084: There was no app host for available for the specified RuntimeIdentifier '{0}'.
Log.LogError(Strings.NoAppHostAvailable, RuntimeIdentifier);
}
else
{
// NETSDK1083: The specified RuntimeIdentifier '{0}' is not recognized.
Log.LogError(Strings.UnsupportedRuntimeIdentifier, RuntimeIdentifier);
}
}
else
{
string appHostPackName = appHostPackPattern.Replace("**RID**", bestAppHostRuntimeIdentifier);
string appHostRelativePathInPackage = Path.Combine("runtimes", bestAppHostRuntimeIdentifier, "native",
DotNetAppHostExecutableNameWithoutExtension + ExecutableExtension.ForRuntimeIdentifier(bestAppHostRuntimeIdentifier));
TaskItem appHostItem = new TaskItem("AppHost");
string appHostPackPath = null;
if (!string.IsNullOrEmpty(TargetingPackRoot))
{
appHostPackPath = GetPackPath(appHostPackName, appHostPackVersion);
}
if (appHostPackPath != null && Directory.Exists(appHostPackPath))
{
// Use AppHost from packs folder
appHostItem.SetMetadata(MetadataKeys.Path, Path.Combine(appHostPackPath, appHostRelativePathInPackage));
}
else
{
// Download apphost pack
TaskItem packageToDownload = new TaskItem(appHostPackName);
packageToDownload.SetMetadata(MetadataKeys.Version, appHostPackVersion);
packagesToDownload.Add(packageToDownload);
appHostItem.SetMetadata(MetadataKeys.PackageName, appHostPackName);
appHostItem.SetMetadata(MetadataKeys.PackageVersion, appHostPackVersion);
appHostItem.SetMetadata(MetadataKeys.RelativePath, appHostRelativePathInPackage);
}
AppHost = new ITaskItem[] { appHostItem };
}
}
if (packagesToDownload.Any())
{
PackagesToDownload = packagesToDownload.ToArray();
}
if (runtimeFrameworks.Any())
{
RuntimeFrameworks = runtimeFrameworks.ToArray();
}
if (targetingPacks.Any())
{
TargetingPacks = targetingPacks.ToArray();
}
if (runtimePacks.Any())
{
RuntimePacks = runtimePacks.ToArray();
}
if (unresolvedFrameworkReferences.Any())
{
UnresolvedFrameworkReferences = unresolvedFrameworkReferences.ToArray();
}
}