private void DoInitializeExports() { lock (this) { if (delegates == null) { if (!(ReflectUtil.IsDynamicAssembly(assemblyLoader.Assembly)) && assemblyLoader.Assembly.GetManifestResourceInfo("ikvm.exports") != null) { List <string> wildcardExports = new List <string>(); using (Stream stream = assemblyLoader.Assembly.GetManifestResourceStream("ikvm.exports")) { BinaryReader rdr = new BinaryReader(stream); int assemblyCount = rdr.ReadInt32(); exports = new Dictionary <int, List <int> >(); exportedAssemblies = new AssemblyLoader[assemblyCount]; exportedAssemblyNames = new string[assemblyCount]; exportedLoaders = new Dictionary <Assembly, AssemblyLoader>(); for (int i = 0; i < assemblyCount; i++) { exportedAssemblyNames[i] = String.Intern(rdr.ReadString()); int typeCount = rdr.ReadInt32(); if (typeCount == 0 && references == null) { wildcardExports.Add(exportedAssemblyNames[i]); } for (int j = 0; j < typeCount; j++) { int hash = rdr.ReadInt32(); List <int> assemblies; if (!exports.TryGetValue(hash, out assemblies)) { assemblies = new List <int>(); exports.Add(hash, assemblies); } assemblies.Add(i); } } } if (references == null) { references = wildcardExports.ToArray(); } } else { AssemblyName[] refNames = assemblyLoader.Assembly.GetReferencedAssemblies(); references = new string[refNames.Length]; for (int i = 0; i < references.Length; i++) { references[i] = refNames[i].FullName; } } delegates = new AssemblyClassLoader[references.Length]; } } }
internal Assembly FindResourceAssembliesImpl(string unmangledName, string name, bool firstOnly, ref List <Assembly> list) { if (ReflectUtil.IsDynamicAssembly(assemblyLoader.Assembly)) { return(null); } if (assemblyLoader.Assembly.GetManifestResourceInfo(name) != null) { if (firstOnly) { return(assemblyLoader.Assembly); } list = new List <Assembly>(); list.Add(assemblyLoader.Assembly); } LazyInitExports(); if (exports != null) { List <int> assemblies; if (exports.TryGetValue(JVM.PersistableHash(unmangledName), out assemblies)) { foreach (int index in assemblies) { AssemblyLoader loader = exportedAssemblies[index]; if (loader == null) { Assembly asm = LoadAssemblyOrClearName(ref exportedAssemblyNames[index], true); if (asm == null) { continue; } loader = exportedAssemblies[index] = GetLoaderForExportedAssembly(asm); } if (loader.Assembly.GetManifestResourceInfo(name) != null) { if (firstOnly) { return(loader.Assembly); } if (list == null) { list = new List <Assembly>(); } list.Add(loader.Assembly); } } } } return(null); }
internal override VfsEntry GetEntry(string name) { VfsEntry entry = base.GetEntry(name); if (entry == null) { Guid guid; if (TryParseGuid(name, out guid)) { foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { if (asm.ManifestModule.ModuleVersionId == guid && !ReflectUtil.IsDynamicAssembly(asm)) { return(GetOrAddEntry(name, asm)); } } } string assemblyName = ParseName(name); if (assemblyName != null) { Assembly asm = null; try { asm = Assembly.Load(assemblyName); } catch { } if (asm != null && !ReflectUtil.IsDynamicAssembly(asm) && name == GetName(asm)) { return(GetOrAddEntry(name, asm)); } } } return(entry); }
// HACK we try to figure out if an assembly is loaded in the Load context // http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx private static bool IsLoadContext(Assembly asm) { if (asm.ReflectionOnly) { return(false); } #if NONMONOTOUCH if (asm.GlobalAssemblyCache) { return(true); } #endif if (ReflectUtil.IsDynamicAssembly(asm) || asm.Location == "") { return(false); } if (System.IO.Path.GetDirectoryName(asm.Location) == System.IO.Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)) { // this is an optimization for the common case were the assembly was loaded from the app directory return(true); } try { if (Assembly.Load(asm.FullName) == asm) { return(true); } } catch { } return(false); }
private IEnumerable <java.net.URL> GetResourcesImpl(string unmangledName, bool getFromDelegates) { if (ReflectUtil.IsDynamicAssembly(assemblyLoader.Assembly)) { yield break; } #if !FIRST_PASS java.util.Enumeration urls = assemblyLoader.FindResources(unmangledName); while (urls.hasMoreElements()) { yield return((java.net.URL)urls.nextElement()); } #endif string name = JVM.MangleResourceName(unmangledName); if (assemblyLoader.Assembly.GetManifestResourceInfo(name) != null) { yield return(MakeResourceURL(assemblyLoader.Assembly, name)); } LazyInitExports(); if (exports != null) { List <int> assemblies; if (exports.TryGetValue(JVM.PersistableHash(unmangledName), out assemblies)) { foreach (int index in assemblies) { AssemblyLoader loader = exportedAssemblies[index]; if (loader == null) { Assembly asm = LoadAssemblyOrClearName(ref exportedAssemblyNames[index], true); if (asm == null) { continue; } loader = exportedAssemblies[index] = GetLoaderForExportedAssembly(asm); } #if !FIRST_PASS urls = loader.FindResources(unmangledName); while (urls.hasMoreElements()) { yield return((java.net.URL)urls.nextElement()); } #endif if (loader.Assembly.GetManifestResourceInfo(name) != null) { yield return(MakeResourceURL(loader.Assembly, name)); } } } } if (!getFromDelegates) { yield break; } for (int i = 0; i < delegates.Length; i++) { if (delegates[i] == null) { Assembly asm = LoadAssemblyOrClearName(ref references[i], false); if (asm != null) { delegates[i] = AssemblyClassLoader.FromAssembly(asm); } } if (delegates[i] != null) { foreach (java.net.URL url in delegates[i].FindResources(unmangledName)) { yield return(url); } } } if (!assemblyLoader.HasJavaModule) { foreach (java.net.URL url in GetBootstrapClassLoader().FindResources(unmangledName)) { yield return(url); } } }