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 @@ +