public Assembly Load (AssemblyName assemblyRef, Evidence assemblySecurity)
{
if (assemblyRef == null)
throw new ArgumentNullException ("assemblyRef");
if (assemblyRef.Name == null || assemblyRef.Name.Length == 0) {
if (assemblyRef.CodeBase != null)
return Assembly.LoadFrom (assemblyRef.CodeBase, assemblySecurity);
else
throw new ArgumentException (Locale.GetText ("assemblyRef.Name cannot be empty."), "assemblyRef");
}
Assembly assembly = LoadAssembly (assemblyRef.FullName, assemblySecurity, false);
if (assembly != null)
return assembly;
if (assemblyRef.CodeBase == null)
throw new FileNotFoundException (null, assemblyRef.Name);
string cb = assemblyRef.CodeBase;
if (cb.ToLower (CultureInfo.InvariantCulture).StartsWith ("file://"))
cb = new Mono.Security.Uri (cb).LocalPath;
try {
assembly = Assembly.LoadFrom (cb, assemblySecurity);
} catch {
throw new FileNotFoundException (null, assemblyRef.Name);
}
AssemblyName aname = assembly.GetName ();
// Name, version, culture, publickeytoken. Anything else?
if (assemblyRef.Name != aname.Name)
throw new FileNotFoundException (null, assemblyRef.Name);
if (assemblyRef.Version != new Version () && assemblyRef.Version != aname.Version)
throw new FileNotFoundException (null, assemblyRef.Name);
if (assemblyRef.CultureInfo != null && assemblyRef.CultureInfo.Equals (aname))
throw new FileNotFoundException (null, assemblyRef.Name);
byte [] pt = assemblyRef.GetPublicKeyToken ();
if (pt != null) {
byte [] loaded_pt = aname.GetPublicKeyToken ();
if (loaded_pt == null || (pt.Length != loaded_pt.Length))
throw new FileNotFoundException (null, assemblyRef.Name);
for (int i = pt.Length - 1; i >= 0; i--)
if (loaded_pt [i] != pt [i])
throw new FileNotFoundException (null, assemblyRef.Name);
}
return assembly;
}