in src/WebJobs.Script/DependencyInjection/ScriptStartupTypeLocator.cs [270:341]
private void ValidateExtensionRequirements(List<Type> startupTypes, ExtensionRequirementsInfo requirementsInfo)
{
if (requirementsInfo.ExtensionRequirementsByStartupType is null)
{
return;
}
List<string> errors = null;
void CollectError(Type extensionType, Version minimumVersion, ExtensionStartupTypeRequirement requirement)
{
_logger.MinimumExtensionVersionNotSatisfied(extensionType.Name, extensionType.Assembly.FullName, minimumVersion, requirement.PackageName, requirement.MinimumPackageVersion);
string requirementNotMetError = $"ExtensionStartupType {extensionType.Name} from assembly '{extensionType.Assembly.FullName}' does not meet the required minimum version of {minimumVersion}. Update your NuGet package reference for {requirement.PackageName} to {requirement.MinimumPackageVersion} or later.";
errors ??= [];
errors.Add(requirementNotMetError);
}
foreach (var extensionType in startupTypes)
{
if (requirementsInfo.ExtensionRequirementsByStartupType.TryGetValue(extensionType.Name, out ExtensionStartupTypeRequirement requirement))
{
Version minimumAssemblyVersion = new Version(requirement.MinimumAssemblyVersion);
AssemblyName assemblyName = extensionType.Assembly.GetName();
Version extensionAssemblyVersion = assemblyName.Version;
string extensionAssemblySimpleName = assemblyName.Name;
if (extensionAssemblySimpleName != requirement.AssemblyName)
{
// We recognized this type, but it did not come from the assembly that we expect, skipping validation
continue;
}
if (requirement.MinimumAssemblyFileVersion != null && !string.IsNullOrEmpty(extensionType.Assembly.Location))
{
Version minimumAssemblyFileVersion = new Version(requirement.MinimumAssemblyFileVersion);
try
{
Version extensionAssemblyFileVersion = new Version(System.Diagnostics.FileVersionInfo.GetVersionInfo(extensionType.Assembly.Location).FileVersion);
if (extensionAssemblyFileVersion < minimumAssemblyFileVersion)
{
CollectError(extensionType, minimumAssemblyFileVersion, requirement);
continue;
}
}
catch (FormatException)
{
// We failed to parse the assembly file version as a Version. We can't do a version check - give up
continue;
}
}
if (extensionAssemblyVersion < minimumAssemblyVersion)
{
CollectError(extensionType, minimumAssemblyVersion, requirement);
}
}
}
if (errors != null && errors.Count > 0)
{
var builder = new System.Text.StringBuilder();
builder.AppendLine("One or more loaded extensions do not meet the minimum requirements. For more information see https://aka.ms/func-min-extension-versions.");
foreach (string e in errors)
{
builder.AppendLine(e);
}
throw new HostInitializationException(builder.ToString());
}
}