public override ExtensionProbeEntry Probe(ExtensionDescriptor descriptor) { if (Disabled) return null; Logger.Information("Probing for module '{0}'", descriptor.Id); string projectPath = GetProjectPath(descriptor); if (projectPath == null) return null; var result = new ExtensionProbeEntry { Descriptor = descriptor, Loader = this, VirtualPath = projectPath, VirtualPathDependencies = GetDependencies(projectPath).ToList(), }; Logger.Information("Done probing for module '{0}'", descriptor.Id); return result; }
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 DateTime GetVirtualPathDepedenciesModificationTimeUtc(ConcurrentDictionary<string, DateTime> virtualPathDependencies, ExtensionProbeEntry probe) { if (!probe.VirtualPathDependencies.Any()) return DateTime.MinValue; Logger.Information("Retrieving modification dates of dependencies of extension '{0}'", probe.Descriptor.Id); var result = probe.VirtualPathDependencies.Max(path => GetVirtualPathModificationTimeUtc(virtualPathDependencies, path)); Logger.Information("Done retrieving modification dates of dependencies of extension '{0}'", probe.Descriptor.Id); return result; }
IEnumerable<DependencyReferenceDescriptor> ProcessExtensionReferences(ExtensionLoadingContext context, ExtensionProbeEntry activatedExtension) { if (activatedExtension == null) return Enumerable.Empty<DependencyReferenceDescriptor>(); var referenceNames = (context.ReferencesByModule.ContainsKey(activatedExtension.Descriptor.Id) ? context.ReferencesByModule[activatedExtension.Descriptor.Id] : Enumerable.Empty<ExtensionReferenceProbeEntry>()) .Select(r => r.Name) .Distinct(StringComparer.OrdinalIgnoreCase); var referencesDecriptors = new List<DependencyReferenceDescriptor>(); foreach (var referenceName in referenceNames) { ProcessExtensionReference(context, activatedExtension, referenceName, referencesDecriptors); } return referencesDecriptors; }
public override ExtensionProbeEntry Probe(ExtensionDescriptor descriptor) { if (Disabled) return null; Logger.Information("Probing for module '{0}'", descriptor.Id); var assemblyPath = GetAssemblyPath(descriptor); if (assemblyPath == null) return null; var result = new ExtensionProbeEntry { Descriptor = descriptor, Loader = this, VirtualPath = assemblyPath, VirtualPathDependencies = new[] { assemblyPath }, }; Logger.Information("Done probing for module '{0}'", descriptor.Id); return result; }