From a5f47f4de027fb0440a0d776758b9ed83bc5f7f4 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Sun, 18 Jul 2010 15:27:54 -0700 Subject: [PATCH] Fix loading of references from DynamicLoader DynamicLoader needs to support loading reference from the "bin" directory of a module, which is very similar to the "PrecompiledDynamicLoader" behavior for loading references. --HG-- branch : dev --- .../Loaders/DynamicExtensionLoader.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs index 69166116e..f788fd7e0 100644 --- a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs +++ b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs @@ -15,6 +15,8 @@ namespace Orchard.Environment.Extensions.Loaders { private readonly IBuildManager _buildManager; private readonly IVirtualPathProvider _virtualPathProvider; private readonly IVirtualPathMonitor _virtualPathMonitor; + private readonly IHostEnvironment _hostEnvironment; + private readonly IAssemblyProbingFolder _assemblyProbingFolder; private readonly IProjectFileParser _projectFileParser; private readonly ReloadWorkaround _reloadWorkaround = new ReloadWorkaround(); @@ -22,6 +24,8 @@ namespace Orchard.Environment.Extensions.Loaders { IBuildManager buildManager, IVirtualPathProvider virtualPathProvider, IVirtualPathMonitor virtualPathMonitor, + IHostEnvironment hostEnvironment, + IAssemblyProbingFolder assemblyProbingFolder, IDependenciesFolder dependenciesFolder, IProjectFileParser projectFileParser) : base(dependenciesFolder) { @@ -29,6 +33,8 @@ namespace Orchard.Environment.Extensions.Loaders { _buildManager = buildManager; _virtualPathProvider = virtualPathProvider; _virtualPathMonitor = virtualPathMonitor; + _hostEnvironment = hostEnvironment; + _assemblyProbingFolder = assemblyProbingFolder; _projectFileParser = projectFileParser; Logger = NullLogger.Instance; @@ -109,6 +115,29 @@ namespace Orchard.Environment.Extensions.Loaders { } } + public override void ReferenceActivated(ExtensionLoadingContext context, ExtensionReferenceProbeEntry referenceEntry) { + //Note: This is the same implementation as "PrecompiledExtensionLoader" + if (string.IsNullOrEmpty(referenceEntry.VirtualPath)) + return; + + string sourceFileName = _virtualPathProvider.MapPath(referenceEntry.VirtualPath); + + // Copy the assembly if it doesn't exist or if it is older than the source file. + bool copyAssembly = + !_assemblyProbingFolder.AssemblyExists(referenceEntry.Name) || + File.GetLastWriteTimeUtc(sourceFileName) > _assemblyProbingFolder.GetAssemblyDateTimeUtc(referenceEntry.Name); + + if (copyAssembly) { + context.CopyActions.Add(() => _assemblyProbingFolder.StoreAssembly(referenceEntry.Name, sourceFileName)); + + // We need to restart the appDomain if the assembly is loaded + if (_hostEnvironment.IsAssemblyLoaded(referenceEntry.Name)) { + Logger.Information("ReferenceActivated: Reference \"{0}\" is activated with newer file and its assembly is loaded, forcing AppDomain restart", referenceEntry.Name); + context.RestartAppDomain = true; + } + } + } + private string GetReferenceVirtualPath(string projectPath, string referenceName) { var path = _virtualPathProvider.GetDirectoryName(projectPath); path = _virtualPathProvider.Combine(path, "bin", referenceName + ".dll"); @@ -118,6 +147,11 @@ namespace Orchard.Environment.Extensions.Loaders { } public override Assembly LoadReference(DependencyReferenceDescriptor reference) { + // DynamicExtensionLoader has 2 types of references: assemblies from module bin directory + // and .csproj. + if (StringComparer.OrdinalIgnoreCase.Equals(Path.GetExtension(reference.VirtualPath), ".dll")) + return _assemblyProbingFolder.LoadAssembly(reference.Name); + return _buildManager.GetCompiledAssembly(reference.VirtualPath); }