Beispiel #1
0
        private Task <IAssembly> LoadDependencyAsync(
            AssemblyLoadContext assemblyLoadContext,
            Dependency dependency,
            CancellationToken cancellationToken)
        {
            return
                (_assemblies.GetOrAdd(
                     dependency,
                     _ => new Lazy <Task <IAssembly> >(LoadDependencyAsyncInternal))
                 .Value);

            // Cannot return ValueTask since possible to await multiple times.
            async Task <IAssembly> LoadDependencyAsyncInternal()
            {
                var assemblyLoadResult =
                    (await
                     _assemblyLoaders
                     .ToAsyncEnumerable()
                     .SelectAwait(x => x.TryLoadAssemblyAsync(
                                      assemblyLoadContext,
                                      dependency,
                                      cancellationToken))
                     .FirstOrDefaultAsync(x => x != null)
                     .ConfigureAwait(false))
                    ?? throw new FlcException(
                              $"Could not find assembly {dependency.Name} {dependency.Version} in any location");

                var subDependencies =
                    await
                    _dependencyAttributeReader
                    .ReadDependencies(assemblyLoadResult.Assembly)
                    .ToAsyncEnumerable()
                    .SelectAwait(x => new ValueTask <IAssembly>(
                                     LoadDependencyAsync(assemblyLoadContext, x, cancellationToken)))
                    .ToImmutableArrayAsync()
                    .ConfigureAwait(false);

                return(_assemblyFactory.FromMetadata(
                           assemblyLoadResult.Assembly,
                           assemblyLoadResult.Bytes,
                           subDependencies));
            }
        }