mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Fix assembly loader to check for assemblies in AppDomain
Also update the csproj build provider and parse to use full assembly name if they are present --HG-- branch : perf
This commit is contained in:
@@ -59,7 +59,6 @@ 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);
|
||||
@@ -67,22 +66,18 @@ namespace Orchard.Environment.Extensions.Compilers {
|
||||
var assembly = loader.LoadReference(reference);
|
||||
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);
|
||||
}
|
||||
var assembly = _assemblyLoader.Load(assemblyReference.FullName);
|
||||
if (assembly != null) {
|
||||
context.AssemblyBuilder.AddAssemblyReference(assembly);
|
||||
}
|
||||
else {
|
||||
Logger.Warning("Assembly reference '{0}' for project '{1}' skipped due to load error", assemblyReference.FullName, context.VirtualPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -40,14 +40,14 @@ namespace Orchard.Environment.Extensions.Compilers {
|
||||
.Elements(ns("ItemGroup"))
|
||||
.Elements(ns("Reference"))
|
||||
.Attributes("Include")
|
||||
.Select(c => new ReferenceDescriptor { AssemblyName = ExtractAssemblyName(c.Value) });
|
||||
.Select(c => new ReferenceDescriptor { SimpleName = ExtractAssemblyName(c.Value), FullName = c.Value });
|
||||
|
||||
var projectReferences = document
|
||||
.Elements(ns("Project"))
|
||||
.Elements(ns("ItemGroup"))
|
||||
.Elements(ns("ProjectReference"))
|
||||
.Attributes("Include")
|
||||
.Select(c => new ReferenceDescriptor { AssemblyName = Path.GetFileNameWithoutExtension(c.Value) });
|
||||
.Select(c => new ReferenceDescriptor { SimpleName = Path.GetFileNameWithoutExtension(c.Value), FullName = Path.GetFileNameWithoutExtension(c.Value) });
|
||||
|
||||
return assemblyReferences.Union(projectReferences);
|
||||
}
|
||||
|
@@ -7,6 +7,7 @@ namespace Orchard.Environment.Extensions.Compilers {
|
||||
public IEnumerable<ReferenceDescriptor> References { get; set; }
|
||||
}
|
||||
public class ReferenceDescriptor {
|
||||
public string AssemblyName { get; set; }
|
||||
public string SimpleName { get; set; }
|
||||
public string FullName { get; set; }
|
||||
}
|
||||
}
|
@@ -109,8 +109,8 @@ namespace Orchard.Environment.Extensions.Loaders {
|
||||
return projectFile.References.Select(r => new ExtensionReferenceProbeEntry {
|
||||
Descriptor = descriptor,
|
||||
Loader = this,
|
||||
Name = r.AssemblyName,
|
||||
VirtualPath = GetReferenceVirtualPath(projectPath, r.AssemblyName)
|
||||
Name = r.SimpleName,
|
||||
VirtualPath = GetReferenceVirtualPath(projectPath, r.SimpleName)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Orchard.Logging;
|
||||
|
||||
@@ -8,6 +11,8 @@ namespace Orchard.Environment {
|
||||
}
|
||||
|
||||
public class DefaultAssemblyLoader : IAssemblyLoader {
|
||||
private readonly ConcurrentDictionary<string, Assembly> _loadedAssemblies = new ConcurrentDictionary<string, Assembly>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public DefaultAssemblyLoader() {
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
@@ -16,12 +21,35 @@ namespace Orchard.Environment {
|
||||
|
||||
public Assembly Load(string assemblyName) {
|
||||
try {
|
||||
return Assembly.Load(assemblyName);
|
||||
return _loadedAssemblies.GetOrAdd(this.ExtractAssemblyName(assemblyName), shortName => LoadWorker(shortName, assemblyName));
|
||||
}
|
||||
catch (Exception e) {
|
||||
Logger.Warning(e, "Error loading assembly '{0}'", assemblyName);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private Assembly LoadWorker(string shortName, string fullName) {
|
||||
// If short assembly name, look in list of loaded assemblies first
|
||||
if (shortName == fullName) {
|
||||
var result = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.Where(a => StringComparer.OrdinalIgnoreCase.Equals(shortName, a.GetName().Name))
|
||||
.SingleOrDefault();
|
||||
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
|
||||
return Assembly.Load(fullName);
|
||||
}
|
||||
}
|
||||
|
||||
public static class AssemblyLoaderExtensions {
|
||||
public static string ExtractAssemblyName(this IAssemblyLoader assemblyLoader, string fullName) {
|
||||
int index = fullName.IndexOf(',');
|
||||
if (index < 0)
|
||||
return fullName;
|
||||
return fullName.Substring(0, index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user