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
This commit is contained in:
Renaud Paquay
2010-11-10 13:24:11 -08:00
parent 97fb671952
commit 0f6e239dd3
4 changed files with 52 additions and 2 deletions

View File

@@ -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<IExtensionLoader> _loaders;
private readonly IAssemblyLoader _assemblyLoader;
public DefaultExtensionCompiler(
IVirtualPathProvider virtualPathProvider,
IProjectFileParser projectFileParser,
IDependenciesFolder dependenciesFolder,
IEnumerable<IExtensionLoader> loaders) {
IEnumerable<IExtensionLoader> 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<string>(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);
}
}
}
}

View File

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

View File

@@ -44,6 +44,7 @@ namespace Orchard.Environment {
builder.RegisterType<AppDataFolderRoot>().As<IAppDataFolderRoot>().SingleInstance();
builder.RegisterType<DefaultExtensionCompiler>().As<IExtensionCompiler>().SingleInstance();
builder.RegisterType<DefaultProjectFileParser>().As<IProjectFileParser>().SingleInstance();
builder.RegisterType<DefaultAssemblyLoader>().As<IAssemblyLoader>().SingleInstance();
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);

View File

@@ -175,6 +175,7 @@
<Compile Include="DisplayManagement\Shapes\ITagBuilderFactory.cs" />
<Compile Include="Environment\Extensions\Loaders\RawThemeExtensionLoader.cs" />
<Compile Include="Environment\Features\FeatureManager.cs" />
<Compile Include="Environment\IAssemblyLoader.cs" />
<Compile Include="Localization\Services\DefaultLocalizedStringManager.cs" />
<Compile Include="Localization\Services\ILocalizedStringManager.cs" />
<Compile Include="Mvc\IOrchardViewPage.cs" />