Ejemplo n.º 1
0
        /// <param name="codeBaseUri">Uri pointing to the assembly</param>
        public static bool Contains(Uri codeBaseUri)
        {
            if (codeBaseUri == null)
            {
                Debug.Fail("codeBaseUri == null");
                return(false);
            }

            lock (GlobalAssemblyCache.Lock)
            {
                if (!GlobalAssemblyCache.FusionLoaded)
                {
                    GlobalAssemblyCache.FusionLoaded = true;
                    System.Reflection.Assembly systemAssembly = typeof(object).Assembly;
                    //^ assume systemAssembly != null && systemAssembly.Location != null;
                    string dir = Path.GetDirectoryName(systemAssembly.Location);
                    //^ assume dir != null;
                    GlobalAssemblyCache.LoadLibrary(Path.Combine(dir, "fusion.dll"));
                }

                IAssemblyEnum assemblyEnum;
                int           rc = GlobalAssemblyCache.CreateAssemblyEnum(out assemblyEnum, null, null, GAC, 0);

                if (rc < 0 || assemblyEnum == null)
                {
                    return(false);
                }

                IApplicationContext applicationContext;
                IAssemblyName       currentName;

                while (assemblyEnum.GetNextAssembly(out applicationContext, out currentName, 0) == 0)
                {
                    //^ assume currentName != null;
                    AssemblyName assemblyName = new AssemblyName(currentName);
                    string       scheme       = codeBaseUri.Scheme;

                    if (scheme != null && assemblyName.CodeBase.StartsWith(scheme))
                    {
                        try
                        {
                            Uri foundUri = new Uri(assemblyName.CodeBase);
                            if (codeBaseUri.Equals(foundUri))
                            {
                                return(true);
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }

                return(false);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Returns the original location of the corresponding assembly if available, otherwise returns the
        /// location of the shadow copy.  If the corresponding assembly is not in the GAC, null is returned.
        /// </summary>
        public static string GetLocation(AssemblyReference assemblyReference)
        {
            if (assemblyReference == null)
            {
                Debug.Fail("assemblyReference == null");
                return(null);
            }

            lock (GlobalAssemblyCache.Lock)
            {
                if (!GlobalAssemblyCache.FusionLoaded)
                {
                    GlobalAssemblyCache.FusionLoaded = true;
                    System.Reflection.Assembly systemAssembly = typeof(object).Assembly;
                    //^ assume systemAssembly != null && systemAssembly.Location != null;
                    string dir = Path.GetDirectoryName(systemAssembly.Location);
                    //^ assume dir != null;
                    GlobalAssemblyCache.LoadLibrary(Path.Combine(dir, "fusion.dll"));
                }

                IAssemblyEnum assemblyEnum;
                CreateAssemblyEnum(out assemblyEnum, null, null, GAC, 0);

                if (assemblyEnum == null)
                {
                    return(null);
                }

                IApplicationContext applicationContext;
                IAssemblyName       currentName;

                while (assemblyEnum.GetNextAssembly(out applicationContext, out currentName, 0) == 0)
                {
                    //^ assume currentName != null;
                    AssemblyName aName = new AssemblyName(currentName);

                    if (assemblyReference.Matches(aName.Name, aName.Version, aName.Culture, aName.PublicKeyToken))
                    {
                        string codeBase = aName.CodeBase;

                        if (codeBase != null && codeBase.StartsWith("file:///"))
                        {
                            return(codeBase.Substring(8));
                        }

                        return(aName.GetLocation());
                    }
                }

                return(null);
            }
        }