private object ResolveAssembly(AssetIdentifier assetId, Assembly hintAssembly) { IEnumerable <Assembly> referencedAssemblies = this._assemblyLoader.SelectMany( a => a.GetReferencedAssemblies().Select( n => Assembly.ReflectionOnlyLoad(n.FullName))); IEnumerable <Assembly> assemblies = this._assemblyLoader.Concat(referencedAssemblies); foreach (Assembly assembly in assemblies) { if (AssetIdentifier.FromAssembly(assembly).Equals(assetId)) { return(assembly); } } return(null); }
public IEnumerable <AssetIdentifier> GetAssetHierarchy(AssetIdentifier assetId) { if (assetId.Type == AssetType.Unknown) { yield break; } yield return(assetId); switch (assetId.Type) { case AssetType.Namespace: string ns = (string)this.Resolve(assetId); Assembly[] matchingAssemblies = this._assemblyLoader.Where(a => a.GetName().Version == assetId.Version) .Where(a => a.GetTypes().Any( t1 => t1.Namespace != null && (StringComparer.Ordinal.Equals(t1.Namespace, ns) || t1.Namespace.StartsWith(ns + ".", StringComparison.Ordinal)))) .ToArray(); if (matchingAssemblies.Length == 0) { throw new InvalidOperationException("Found no assembly containing namespace: " + ns); } if (matchingAssemblies.Length > 1) { TraceSources.AssetResolverSource.TraceWarning( "Namespace {0} found in more than one assembly: {1}", ns, string.Join(", ", matchingAssemblies.Select(a => a.GetName().Name))); } yield return(AssetIdentifier.FromAssembly(matchingAssemblies[0])); break; case AssetType.Type: Type t = (Type)this.Resolve(assetId); while (t.IsNested) { t = t.DeclaringType; yield return(AssetIdentifier.FromMemberInfo(t)); } yield return(AssetIdentifier.FromNamespace(t.Namespace, t.Assembly.GetName().Version)); yield return(AssetIdentifier.FromAssembly(t.Assembly)); break; case AssetType.Method: case AssetType.Field: case AssetType.Event: case AssetType.Property: object resolve = this.Resolve(assetId); MemberInfo mi = (MemberInfo)resolve; foreach ( AssetIdentifier aid in this.GetAssetHierarchy(AssetIdentifier.FromMemberInfo(mi.ReflectedType))) { yield return(aid); } break; case AssetType.Assembly: yield break; default: throw new ArgumentOutOfRangeException(); } }