Tweak assembly loading policy one more

We have this in Orchard.Setup.csproj:
    <Reference Include="Autofac, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\..\lib\autofac\Autofac.dll</HintPath>
    </Reference>

However, version of autoface we are using is not 2.1.13.813.

This means that, even if the full assembly name is specified in the csproj file,
we still need to lookup the assembly by short name if we can't find it.

--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-12-08 20:07:58 -08:00
parent ee271abff2
commit 4df23c2221

View File

@@ -26,31 +26,39 @@ namespace Orchard.Environment {
return _loadedAssemblies.GetOrAdd(this.ExtractAssemblyShortName(assemblyName), shortName => LoadWorker(shortName, assemblyName));
}
catch (Exception e) {
Logger.Warning(e, "Error loading assembly '{0}'", assemblyName);
Logger.Error(e, "Error loading assembly '{0}'", assemblyName);
return null;
}
}
private Assembly LoadWorker(string shortName, string fullName) {
// Try loading the assembly with regular fusion rules first (common case)
Assembly result = LookupFusion(fullName);
Assembly result;
// Try loading with full name first (if there is a full name)
if (fullName != shortName) {
result = LookupFusion(shortName);
if (result != null)
return result;
}
// Try loading with short name
result = LookupFusion(shortName);
if (result != null)
return result;
// If short assembly name, try to figure out the full assembly name using
// a policy compatible with Medium Trust.
if (shortName == fullName) {
var resolvedName = _assemblyNameResolvers.Select(r => r.Resolve(shortName)).Where(f => f != null).FirstOrDefault();
if (resolvedName != null)
return Assembly.Load(resolvedName);
// Try resolving the short name to a full name
var resolvedName = _assemblyNameResolvers.Select(r => r.Resolve(shortName)).Where(f => f != null).FirstOrDefault();
if (resolvedName != null) {
return Assembly.Load(resolvedName);
}
// Try again so that we get the exception this time
return Assembly.Load(fullName);
}
private static Assembly LookupFusion(string fullName) {
private static Assembly LookupFusion(string name) {
try {
return Assembly.Load(fullName);
return Assembly.Load(name);
}
catch {
return null;