Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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();
            }
        }