|
|
@@ -35,6 +35,7 @@ using System.IO;
|
|
|
using System.Text;
|
|
|
using System.Globalization;
|
|
|
using System.Collections;
|
|
|
+using System.Collections.Concurrent;
|
|
|
using System.Reflection;
|
|
|
using System.Security;
|
|
|
using System.Security.Permissions;
|
|
|
@@ -61,7 +62,7 @@ namespace System.Web
|
|
|
public sealed class HttpRuntime
|
|
|
{
|
|
|
static bool domainUnloading;
|
|
|
-
|
|
|
+ static SplitOrderedList <string, string> registeredAssemblies;
|
|
|
#if TARGET_J2EE
|
|
|
static QueueManager queue_manager { get { return _runtime._queue_manager; } }
|
|
|
static TraceManager trace_manager { get { return _runtime._trace_manager; } }
|
|
|
@@ -153,6 +154,7 @@ namespace System.Web
|
|
|
if (trace_manager.HasException)
|
|
|
initialException = trace_manager.InitialException;
|
|
|
|
|
|
+ registeredAssemblies = new SplitOrderedList <string, string> (StringComparer.Ordinal);
|
|
|
cache = new Cache ();
|
|
|
internalCache = new Cache ();
|
|
|
internalCache.DependencyCache = internalCache;
|
|
|
@@ -164,6 +166,10 @@ namespace System.Web
|
|
|
});
|
|
|
end_of_send_cb = new HttpWorkerRequest.EndOfSendNotification (EndOfSend);
|
|
|
}
|
|
|
+
|
|
|
+ internal static SplitOrderedList <string, string> RegisteredAssemblies {
|
|
|
+ get { return registeredAssemblies; }
|
|
|
+ }
|
|
|
|
|
|
#region AppDomain handling
|
|
|
internal static bool DomainUnloading {
|
|
|
@@ -706,22 +712,29 @@ namespace System.Web
|
|
|
AssemblyName an = new AssemblyName (e.Name);
|
|
|
string dynamic_base = AppDomain.CurrentDomain.SetupInformation.DynamicBase;
|
|
|
string compiled = Path.Combine (dynamic_base, an.Name + ".compiled");
|
|
|
+ string asmPath;
|
|
|
|
|
|
- if (!File.Exists (compiled))
|
|
|
- return null;
|
|
|
-
|
|
|
- PreservationFile pf;
|
|
|
- try {
|
|
|
- pf = new PreservationFile (compiled);
|
|
|
- } catch (Exception ex) {
|
|
|
- throw new HttpException (
|
|
|
- String.Format ("Failed to read preservation file {0}", an.Name + ".compiled"),
|
|
|
- ex);
|
|
|
+ if (!File.Exists (compiled)) {
|
|
|
+ string fn = an.FullName;
|
|
|
+ if (!RegisteredAssemblies.Find ((uint)fn.GetHashCode (), fn, out asmPath))
|
|
|
+ return null;
|
|
|
+ } else {
|
|
|
+ PreservationFile pf;
|
|
|
+ try {
|
|
|
+ pf = new PreservationFile (compiled);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ throw new HttpException (
|
|
|
+ String.Format ("Failed to read preservation file {0}", an.Name + ".compiled"),
|
|
|
+ ex);
|
|
|
+ }
|
|
|
+ asmPath = Path.Combine (dynamic_base, pf.Assembly + ".dll");
|
|
|
}
|
|
|
+
|
|
|
+ if (String.IsNullOrEmpty (asmPath))
|
|
|
+ return null;
|
|
|
|
|
|
Assembly ret = null;
|
|
|
try {
|
|
|
- string asmPath = Path.Combine (dynamic_base, pf.Assembly + ".dll");
|
|
|
ret = Assembly.LoadFrom (asmPath);
|
|
|
} catch (Exception) {
|
|
|
// ignore
|