private static bool AssemblySatisfiesReference(AssemblyName assemblyName, AssemblyName reference)
 {
     if (reference.Name != assemblyName.Name)
     {
         return(false);
     }
     if ((reference.Version != null) && !reference.Version.Equals(assemblyName.Version))
     {
         return(false);
     }
     if ((reference.CultureInfo != null) && !reference.CultureInfo.Equals(assemblyName.CultureInfo))
     {
         return(false);
     }
     byte[] publicKeyToken = reference.GetPublicKeyToken();
     if (publicKeyToken != null)
     {
         byte[] curKeyToken = assemblyName.GetPublicKeyToken();
         if (!AssemblyNameEqualityComparer.IsSameKeyToken(publicKeyToken, curKeyToken))
         {
             return(false);
         }
     }
     return(true);
 }
コード例 #2
0
 // this code is borrowed from XamlSchemaContext
 internal bool AssemblySatisfiesReference(AssemblyName assemblyName)
 {
     if (this.wrappedReference.AssemblyName.Name != assemblyName.Name)
     {
         return(false);
     }
     if (this.wrappedReference.AssemblyName.Version != null && !this.wrappedReference.AssemblyName.Version.Equals(assemblyName.Version))
     {
         return(false);
     }
     if (this.wrappedReference.AssemblyName.CultureInfo != null && !this.wrappedReference.AssemblyName.CultureInfo.Equals(assemblyName.CultureInfo))
     {
         return(false);
     }
     byte[] requiredToken = this.wrappedReference.AssemblyName.GetPublicKeyToken();
     if (requiredToken != null)
     {
         byte[] actualToken = assemblyName.GetPublicKeyToken();
         if (!AssemblyNameEqualityComparer.IsSameKeyToken(requiredToken, actualToken))
         {
             return(false);
         }
     }
     return(true);
 }
コード例 #3
0
        internal IEnumerable <KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> > GetRegistrarTypes()
        {
            var comparer = new AssemblyNameEqualityComparer();
            var types    = new List <Type>();

            Assembly[]          scansedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            List <AssemblyName> proxyAssemblies   = (from p in this.proxies select p.Value.GetType().Assembly.GetName()).ToList();
            List <Assembly>     workingAssemblies =
                (from s in scansedAssemblies from r in proxyAssemblies where s.GetReferencedAssemblies().Contains(r, comparer) select s).ToList();

            workingAssemblies.Add(this.GetType().Assembly);
            foreach (Assembly assembly in workingAssemblies)
            {
                try
                {
                    types.AddRange(assembly.GetTypes());
                }
                catch (ReflectionTypeLoadException loadEx)
                {
                    List <Type> foundTypes = (from t in loadEx.Types where t.IsNotNull() select t).ToList();
                    types.AddRange(foundTypes);
                }
            }
            var preOrdered = new Queue <KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> >();

            foreach (Type type in types)
            {
                if (type.IsInterface)
                {
                    continue;
                }
                foreach (var proxy in this.proxies)
                {
                    if (proxy.Key.IsAssignableFrom(type) && !ReferenceEquals(type.GetConstructor(new Type[0]), null))
                    {
                        preOrdered.Add(new KeyValuePair <Type, IServiceLocationRegistrarProxyFactory>(type, proxy.Value));
                    }
                }
            }

            var orderedList = new List <KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> >();

            while (preOrdered.Count > 0)
            {
                KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> type = preOrdered.Remove();
                bool addToList = true;
                foreach (var stackType in preOrdered)
                {
                    if (type.Key.Assembly.GetReferencedAssemblies().Contains(stackType.Key.Assembly.GetName(), comparer))
                    {
                        addToList = false;
                        preOrdered.Add(type);
                        break;
                    }
                }
                if (addToList)
                {
                    orderedList.Add(type);
                }
            }

            return(orderedList);
        }