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