From 0f6e239dd33cd9bb5b331c9d9aae71130d460790 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Wed, 10 Nov 2010 13:24:11 -0800 Subject: [PATCH] Update build provider to load assembly references The build provider for .csproj file of modules now tries to load all assembly reference specified in the "references" section of the csproj file. --HG-- branch : perf --- .../Compilers/DefaultExtensionCompiler.cs | 25 +++++++++++++++-- src/Orchard/Environment/IAssemblyLoader.cs | 27 +++++++++++++++++++ src/Orchard/Environment/OrchardStarter.cs | 1 + src/Orchard/Orchard.Framework.csproj | 1 + 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/Orchard/Environment/IAssemblyLoader.cs diff --git a/src/Orchard/Environment/Extensions/Compilers/DefaultExtensionCompiler.cs b/src/Orchard/Environment/Extensions/Compilers/DefaultExtensionCompiler.cs index 6f3afcce2..75d499fb4 100644 --- a/src/Orchard/Environment/Extensions/Compilers/DefaultExtensionCompiler.cs +++ b/src/Orchard/Environment/Extensions/Compilers/DefaultExtensionCompiler.cs @@ -3,6 +3,7 @@ using System.CodeDom; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using Orchard.Environment.Extensions.Loaders; using Orchard.FileSystems.Dependencies; using Orchard.FileSystems.VirtualPath; @@ -18,17 +19,20 @@ namespace Orchard.Environment.Extensions.Compilers { private readonly IProjectFileParser _projectFileParser; private readonly IDependenciesFolder _dependenciesFolder; private readonly IEnumerable _loaders; + private readonly IAssemblyLoader _assemblyLoader; public DefaultExtensionCompiler( IVirtualPathProvider virtualPathProvider, IProjectFileParser projectFileParser, IDependenciesFolder dependenciesFolder, - IEnumerable loaders) { + IEnumerable loaders, + IAssemblyLoader assemblyLoader) { _virtualPathProvider = virtualPathProvider; _projectFileParser = projectFileParser; _dependenciesFolder = dependenciesFolder; _loaders = loaders; + _assemblyLoader = assemblyLoader; T = NullLocalizer.Instance; Logger = NullLogger.Instance; @@ -55,13 +59,30 @@ namespace Orchard.Environment.Extensions.Compilers { } // Add assembly references + var addedReferences = new HashSet(StringComparer.OrdinalIgnoreCase); foreach (var reference in dependencyDescriptor.References) { var referenceTemp = reference; var loader = _loaders.SingleOrDefault(l => l.Name == referenceTemp.LoaderName); if (loader != null) { var assembly = loader.LoadReference(reference); - if (assembly != null) + if (assembly != null) { context.AssemblyBuilder.AddAssemblyReference(assembly); + addedReferences.Add(reference.Name); + } + } + } + + // Load references specified in project file + foreach (var assemblyReference in descriptor.References) { + if (!addedReferences.Contains(assemblyReference.AssemblyName)) { + var assembly = _assemblyLoader.Load(assemblyReference.AssemblyName); + if (assembly != null) { + context.AssemblyBuilder.AddAssemblyReference(assembly); + addedReferences.Add(assemblyReference.AssemblyName); + } + else { + Logger.Warning("Assembly reference '{0}' for project '{1}' skipped due to load error", assemblyReference.AssemblyName, context.VirtualPath); + } } } } diff --git a/src/Orchard/Environment/IAssemblyLoader.cs b/src/Orchard/Environment/IAssemblyLoader.cs new file mode 100644 index 000000000..004d45ac3 --- /dev/null +++ b/src/Orchard/Environment/IAssemblyLoader.cs @@ -0,0 +1,27 @@ +using System; +using System.Reflection; +using Orchard.Logging; + +namespace Orchard.Environment { + public interface IAssemblyLoader { + Assembly Load(string assemblyName); + } + + public class DefaultAssemblyLoader : IAssemblyLoader { + public DefaultAssemblyLoader() { + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + + public Assembly Load(string assemblyName) { + try { + return Assembly.Load(assemblyName); + } + catch (Exception e) { + Logger.Warning(e, "Error loading assembly '{0}'", assemblyName); + return null; + } + } + } +} diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index 885fa1a43..ebb44bead 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -44,6 +44,7 @@ namespace Orchard.Environment { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); RegisterVolatileProvider(builder); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 29a9e7ad1..3c0329da1 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -175,6 +175,7 @@ +