internal Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            FunctionAssemblyLoadContext context = GetFunctionContext(args.RequestingAssembly);
            Assembly result = null;

            if (context != null)
            {
                result = context.ResolveAssembly(args.Name);
            }

            // If we were unable to resolve the assembly, apply the current App Domain policy and attempt to load it.
            // This allows us to correctly handle retargetable assemblies, redirects, etc.
            if (result == null)
            {
                string assemblyName = ((AppDomain)sender).ApplyPolicy(args.Name);

                // If after applying the current policy, we now have a different target assembly name, attempt to load that
                // assembly
                if (string.Compare(assemblyName, args.Name) != 0)
                {
                    result = Assembly.Load(assemblyName);
                }
            }

            // If we have an function context and failed to resolve a function assembly dependency,
            // log the failure as this is usually caused by missing private assemblies.
            if (context != null && result == null)
            {
                context.TraceWriter.Warning(string.Format(CultureInfo.InvariantCulture,
                                                          "Unable to find assembly '{0}'. Are you missing a private assembly file?", args.Name));
            }

            return(result);
        }
Пример #2
0
        public FunctionAssemblyLoadContext CreateOrUpdateContext(FunctionMetadata metadata, Assembly functionAssembly, IFunctionMetadataResolver metadataResolver,
                                                                 TraceWriter traceWriter, ILoggerFactory loggerFactory)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }
            if (functionAssembly == null)
            {
                throw new ArgumentNullException("functionAssembly");
            }
            if (metadataResolver == null)
            {
                throw new ArgumentNullException("metadataResolver");
            }
            if (traceWriter == null)
            {
                throw new ArgumentNullException("traceWriter");
            }

            ILogger logger  = loggerFactory?.CreateLogger(LogCategories.Startup);
            var     context = new FunctionAssemblyLoadContext(metadata, functionAssembly, metadataResolver, traceWriter, logger);

            return(_functionContexts.AddOrUpdate(metadata.Name, context, (s, o) => context));
        }
        private FunctionAssemblyLoadContext GetFunctionContext(Assembly requestingAssembly)
        {
            if (requestingAssembly == null)
            {
                return(null);
            }

            FunctionAssemblyLoadContext context = null;
            string functionName = GetFunctionNameFromAssembly(requestingAssembly);

            if (functionName != null)
            {
                context = GetFunctionContext(functionName);

                // If the context is for a different assembly
                if (context != null && context.FunctionAssembly != requestingAssembly)
                {
                    return(null);
                }
            }
            else
            {
                context = GetFunctionContextFromDependency(requestingAssembly);
            }

            return(context);
        }
Пример #4
0
        private static FunctionAssemblyLoadContext CreateSharedContext()
        {
            var sharedContext = new FunctionAssemblyLoadContext(ResolveFunctionBaseProbingPath());

            Default.Resolving += HandleDefaultContextFallback;

            return(sharedContext);
        }
Пример #5
0
        private Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            FunctionAssemblyLoadContext context = GetFunctionContext(args.RequestingAssembly);
            Assembly result = null;

            if (context != null)
            {
                result = context.ResolveAssembly(args.Name);
            }

            return(result);
        }
        internal Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            FunctionAssemblyLoadContext context = GetFunctionContext(args.RequestingAssembly);
            Assembly result = null;

            if (context != null)
            {
                result = context.ResolveAssembly(args.Name);

                // Failed to resolve a function assembly dependency, log the failure as this
                // is usually caused by missing private assemblies.
                if (result == null)
                {
                    context.TraceWriter.Warning(string.Format(CultureInfo.InvariantCulture, "Unable to find assembly '{0}'. Are you missing a private assembly file?", args.Name));
                }
            }

            return(result);
        }
Пример #7
0
        public FunctionAssemblyLoadContext CreateOrUpdateContext(FunctionMetadata metadata, Assembly functionAssembly, FunctionMetadataResolver metadataResolver)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }
            if (functionAssembly == null)
            {
                throw new ArgumentNullException("functionAssembly");
            }
            if (metadataResolver == null)
            {
                throw new ArgumentNullException("metadataResolver");
            }

            var context = new FunctionAssemblyLoadContext(metadata, functionAssembly, metadataResolver);

            return(_functionContexts.AddOrUpdate(metadata.Name, context, (s, o) => context));
        }
Пример #8
0
        public Assembly ResolveAssembly(AssemblyName assemblyName, FunctionAssemblyLoadContext targetContext)
        {
            Assembly assembly = null;

            if (_externalReferences.TryGetValue(assemblyName.FullName, out string assemblyPath))
            {
                // For external references, we load the assemblies into the shared context:
                assembly = FunctionAssemblyLoadContext.Shared.LoadFromAssemblyPath(assemblyPath, true);
            }
            else if (TryResolvePrivateAssembly(assemblyName.FullName, out assemblyPath))
            {
                assembly = targetContext.LoadFromStream(new MemoryStream(File.ReadAllBytes(assemblyPath)));
            }
            else if (_packageAssemblyResolver.TryResolveAssembly(assemblyName.FullName, out assemblyPath))
            {
                assembly = targetContext.LoadFromAssemblyPath(assemblyPath);
            }
            else
            {
                _extensionSharedAssemblyProvider.TryResolveAssembly(assemblyName.FullName, FunctionAssemblyLoadContext.Shared, _logger, out assembly);
            }

            return(assembly);
        }
 public Assembly ResolveAssembly(AssemblyName assemblyName, FunctionAssemblyLoadContext targetContext)
 {
     return(null);
 }
        public FunctionAssemblyLoadContext CreateOrUpdateContext(FunctionMetadata metadata, Assembly functionAssembly, IFunctionMetadataResolver metadataResolver, TraceWriter traceWriter)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }
            if (functionAssembly == null)
            {
                throw new ArgumentNullException("functionAssembly");
            }
            if (metadataResolver == null)
            {
                throw new ArgumentNullException("metadataResolver");
            }
            if (traceWriter == null)
            {
                throw new ArgumentNullException("traceWriter");
            }

            var context = new FunctionAssemblyLoadContext(metadata, functionAssembly, metadataResolver, traceWriter);

            return _functionContexts.AddOrUpdate(metadata.Name, context, (s, o) => context);
        }