private void ProcessExtensionReference(ExtensionLoadingContext context,
                                               ExtensionProbeEntry activatedExtension,
                                               string referenceName,
                                               IList <DependencyReferenceDescriptor> activatedReferences)
        {
            // If the reference is an extension has been processed already, use the same loader as
            // that extension, since a given extension should be loaded with a unique loader for the
            // whole application
            var bestExtensionReference = context.ProcessedExtensions.ContainsKey(referenceName) ?
                                         context.ProcessedExtensions[referenceName] :
                                         null;

            // Activated the extension reference
            if (bestExtensionReference != null)
            {
                activatedReferences.Add(new DependencyReferenceDescriptor
                {
                    LoaderName  = bestExtensionReference.Loader.Name,
                    Name        = referenceName,
                    VirtualPath = bestExtensionReference.VirtualPath
                });

                return;
            }

            // Skip references from "~/bin"
            if (_buildManager.HasReferencedAssembly(referenceName))
            {
                return;
            }

            // Binary references
            var references = context.ReferencesByName.ContainsKey(referenceName) ?
                             context.ReferencesByName[referenceName] :
                             Enumerable.Empty <ExtensionReferenceProbeEntry>();

            var bestBinaryReference = references
                                      .Where(entry => !string.IsNullOrEmpty(entry.VirtualPath))
                                      .Select(entry => new { Entry = entry, LastWriteTimeUtc = _virtualPathProvider.GetFileLastWriteTimeUtc(entry.VirtualPath) })
                                      .OrderBy(e => e.LastWriteTimeUtc)
                                      .ThenBy(e => e.Entry.Name)
                                      .FirstOrDefault();

            // Activate the binary ref
            if (bestBinaryReference != null)
            {
                if (!context.ProcessedReferences.ContainsKey(bestBinaryReference.Entry.Name))
                {
                    context.ProcessedReferences.Add(bestBinaryReference.Entry.Name, bestBinaryReference.Entry);
                    bestBinaryReference.Entry.Loader.ReferenceActivated(context, bestBinaryReference.Entry);
                }
                activatedReferences.Add(new DependencyReferenceDescriptor
                {
                    LoaderName  = bestBinaryReference.Entry.Loader.Name,
                    Name        = bestBinaryReference.Entry.Name,
                    VirtualPath = bestBinaryReference.Entry.VirtualPath
                });
                return;
            }
        }
        private void ProcessExtensionReference(ExtensionLoadingContext context, string referenceName, ICollection <DependencyReferenceDescriptor> activatedReferences)
        {
            //如果参考是一个扩展已经被处理,使用相同的装载机扩展,因为给定的扩展名应具有独特的装载机在整个应用程序加载
            var bestExtensionReference = context.ProcessedExtensions.ContainsKey(referenceName) ?
                                         context.ProcessedExtensions[referenceName] :
                                         null;

            //激活扩展引用
            if (bestExtensionReference != null)
            {
                activatedReferences.Add(new DependencyReferenceDescriptor
                {
                    LoaderName  = bestExtensionReference.Loader.Name,
                    Name        = referenceName,
                    VirtualPath = bestExtensionReference.VirtualPath
                });

                return;
            }

            //跳过来自 "~/bin" 的引用。
            if (_buildManager.HasReferencedAssembly(referenceName))
            {
                return;
            }

            //二进制引用
            var references = context.ReferencesByName.ContainsKey(referenceName) ?
                             context.ReferencesByName[referenceName] :
                             Enumerable.Empty <ExtensionReferenceProbeEntry>();

            var bestBinaryReference = references
                                      .Where(entry => !string.IsNullOrEmpty(entry.VirtualPath))
                                      .Select(entry => new { Entry = entry, LastWriteTimeUtc = _virtualPathProvider.GetFileLastWriteTimeUtc(entry.VirtualPath) })
                                      .OrderBy(e => e.LastWriteTimeUtc)
                                      .ThenBy(e => e.Entry.Name)
                                      .FirstOrDefault();

            //激活二进制引用
            if (bestBinaryReference == null)
            {
                return;
            }

            if (!context.ProcessedReferences.ContainsKey(bestBinaryReference.Entry.Name))
            {
                context.ProcessedReferences.Add(bestBinaryReference.Entry.Name, bestBinaryReference.Entry);
                bestBinaryReference.Entry.Loader.ReferenceActivated(context, bestBinaryReference.Entry);
            }
            activatedReferences.Add(new DependencyReferenceDescriptor
            {
                LoaderName  = bestBinaryReference.Entry.Loader.Name,
                Name        = bestBinaryReference.Entry.Name,
                VirtualPath = bestBinaryReference.Entry.VirtualPath
            });
        }