in sdk/Sdk/FunctionMetadataGenerator.cs [46:93]
public IEnumerable<SdkFunctionMetadata> GenerateFunctionMetadata(string assemblyPath, IEnumerable<ITaskItem> referencePaths)
{
var targetAssemblies = new List<string>() { assemblyPath };
// We don't need to scan assemblies that come from a framework (.NET, AspNetCore), they won't have functions types in them.
targetAssemblies.AddRange(referencePaths.Where(x => x.GetMetadata("FrameworkReferenceName") == "").Select(x => x.ItemSpec));
_logger.LogMessage($"Found {targetAssemblies.Count} assemblies to evaluate.");
var resolver = new DefaultAssemblyResolver();
foreach (string referencePath in referencePaths.Select(p => Path.GetDirectoryName(p.ItemSpec)).Distinct())
{
resolver.AddSearchDirectory(referencePath);
}
ReaderParameters readerParams = new ReaderParameters { AssemblyResolver = resolver };
var functions = new List<SdkFunctionMetadata>();
foreach (var path in targetAssemblies)
{
using (_logger.Indent())
{
_logger.LogMessage($"Collecting function metadata from {Path.GetFileName(path)}.");
using (_logger.Indent())
{
try
{
var moduleDefinition = ModuleDefinition.ReadModule(path, readerParams);
functions.AddRange(GenerateFunctionMetadata(moduleDefinition));
}
catch (BadImageFormatException)
{
_logger.LogMessage($"Skipping file '{Path.GetFileName(path)}' because of a {nameof(BadImageFormatException)}.");
}
catch (FunctionsMetadataGenerationException ex)
{
_logger.LogError($"Failed to generate function metadata from {Path.GetFileName(path)}: {ex.Message}", path);
throw;
}
catch (Exception ex)
{
_logger.LogWarning($"Could not evaluate '{Path.GetFileName(path)}' for functions metadata. Exception message: {ex}");
}
}
}
}
return functions;
}