private void ValidateExtensionRequirements()

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());
            }
        }