Beispiel #1
0
        public static IEnumerable <InstallReference> GetInstallReferences(AssemblyName assemblyName)
        {
            IAssemblyName fusionAssemblyName = null;

            ComCheck(FusionApi.CreateAssemblyNameObject(out fusionAssemblyName, assemblyName.GetFullyQualifiedName(), CreateAssemblyNameObjectFlags.ParseDisplayName, IntPtr.Zero));

            IInstallReferenceEnum installReferenceEnum = null;

            ComCheck(FusionApi.CreateInstallReferenceEnum(out installReferenceEnum, fusionAssemblyName, 0, IntPtr.Zero));

            IInstallReferenceItem item = null;

            do
            {
                int hResult = installReferenceEnum.GetNextInstallReferenceItem(out item, 0, IntPtr.Zero);
                if ((uint)hResult == 0x80070103)  // ERROR_NO_MORE_ITEMS
                {
                    yield break;
                }
                ComCheck(hResult);

                IntPtr refData;
                ComCheck(item.GetReference(out refData, 0, IntPtr.Zero));

                FusionInstallReference fusionReference = new FusionInstallReference();
                Marshal.PtrToStructure(refData, fusionReference);

                var reference = new InstallReference(InstallReferenceGuid.ToType(fusionReference.GuidScheme), fusionReference.Identifier,
                                                     fusionReference.NonCanonicalData);

                yield return(reference);
            } while (true);
        }
Beispiel #2
0
        private static IAssemblyCache GetAssemblyCache()
        {
            IAssemblyCache assemblyCache = null;

            ComCheck(FusionApi.CreateAssemblyCache(out assemblyCache, 0));
            return(assemblyCache);
        }
Beispiel #3
0
        public static IEnumerable <AssemblyName> GetAssemblies()
        {
            IAssemblyEnum assemblyEnum = null;

            ComCheck(FusionApi.CreateAssemblyEnum(out assemblyEnum, IntPtr.Zero, null, AssemblyCacheFlags.Gac, IntPtr.Zero));

            IAssemblyName fusionAssemblyName = null;

            do
            {
                ComCheck(assemblyEnum.GetNextAssembly(IntPtr.Zero, out fusionAssemblyName, 0));
                if (fusionAssemblyName != null)
                {
                    yield return(new AssemblyName(GlobalAssemblyCache.GetDisplayName(fusionAssemblyName)));
                }
            } while (fusionAssemblyName != null);
        }
Beispiel #4
0
        public static String GetAssemblyCacheClr4Path()
        {
            int           bufferSize = 512;
            StringBuilder buffer     = new StringBuilder(bufferSize);

            int hResult = FusionApi.GetCachePath(AssemblyCacheFlags.RootEx, buffer, ref bufferSize);

            if ((uint)hResult == 0x8007007A)  // ERROR_INSUFFICIENT_BUFFER
            {
                buffer = new StringBuilder(bufferSize);
                ComCheck(FusionApi.GetCachePath(AssemblyCacheFlags.RootEx, buffer, ref bufferSize));
            }
            else
            {
                ComCheck(hResult);
            }

            return(buffer.ToString());
        }