Подтвердить что ты не робот

Программно. Проверить dll существует в Gac или нет. Если так отображать его в сетке

У меня будет список DLL в папке, я хочу проверить наличие DLL для приложения или нет. Если так, я хочу добавить это имя приложения в grid.Can, любой из них расскажет, как это сделать программно. Спасибо в Advance

4b9b3361

Ответ 1

Сделайте сборку .LoadFrom и проверьте GlobalAssemblyCache

testAssembly = Assembly.LoadFrom(dllname);

if (!testAssembly.GlobalAssemblyCache)
{
  // not in gac
}

Ответ 2

Я считаю, что правильным способом является API Fusion COM.

Здесь, как его использовать:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace IsAssemblyInGAC
{
    internal class GacApi
    {
        [DllImport("fusion.dll")]
        internal static extern IntPtr CreateAssemblyCache(
            out IAssemblyCache ppAsmCache, int reserved);
    }

    // GAC Interfaces - IAssemblyCache. As a sample, non used vtable entries     
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
    Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")]
    internal interface IAssemblyCache
    {
        int Dummy1();
        [PreserveSig()]
        IntPtr QueryAssemblyInfo(
            int flags,
            [MarshalAs(UnmanagedType.LPWStr)]
            String assemblyName,
            ref ASSEMBLY_INFO assemblyInfo);

        int Dummy2();
        int Dummy3();
        int Dummy4();
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct ASSEMBLY_INFO
    {
        public int cbAssemblyInfo;
        public int assemblyFlags;
        public long assemblySizeInKB;

        [MarshalAs(UnmanagedType.LPWStr)]
        public String currentAssemblyPath;

        public int cchBuf;
    }

    class Program
    {
        static void Main()
        {
            try
            {
                Console.WriteLine(QueryAssemblyInfo("System"));
            }
            catch(System.IO.FileNotFoundException e)
            {
                Console.WriteLine(e.Message);
            }
        }

        // If assemblyName is not fully qualified, a random matching may be 
        public static String QueryAssemblyInfo(String assemblyName)
        {
            ASSEMBLY_INFO assembyInfo = new ASSEMBLY_INFO ();
            assembyInfo.cchBuf = 512;
            assembyInfo.currentAssemblyPath = new String('\0', 
                assembyInfo.cchBuf) ;

            IAssemblyCache assemblyCache = null;

            // Get IAssemblyCache pointer
            IntPtr hr = GacApi.CreateAssemblyCache(out assemblyCache, 0);
            if (hr == IntPtr.Zero)
            {
                hr = assemblyCache.QueryAssemblyInfo(1, assemblyName, ref assembyInfo);
                if (hr != IntPtr.Zero)
                {
                    Marshal.ThrowExceptionForHR(hr.ToInt32());
                }
            }
            else
            {
                Marshal.ThrowExceptionForHR(hr.ToInt32());
            }
            return assembyInfo.currentAssemblyPath;
        }
    }
}

Использовать метод QueryAssemblyInfo.

Ответ 3

Здесь документация для недокументированного API GAC: DOC: API-интерфейсы глобального сборщика (GAC) не документированы в комплекте разработки программного обеспечения .NET Framework (SDK ) Документация.

Этот API предназначен для использования из собственного кода, поэтому эта статья может помочь вам запрограммировать его с С#.

Если вы после быстрого решения, gacutil /l работает.

Ответ 4

Обычно люди делают предположение, что GAC находится в сборке c: \\, что на 99% истинно. Таким образом, вы можете написать код для повторения файлов, найденных в этой папке.

Более ортодоксальным способом будет использование API Fusion, который основан на COM. Управляемый обертку доступен на этом сайте блога:

http://blogs.msdn.com/junfeng/archive/2004/09/14/229653.aspx

На сайте также содержится пример управляемого кода, показывающий, как использовать API Fusion для перечисления установленных сборок - код в значительной степени выписан для вас, поэтому просто ctrl + c, а затем ctrl + v...:)

http://blogs.msdn.com/b/junfeng/archive/2004/09/14/229650.aspx

НТН...

Ответ 5

Я знаю, что это старый вопрос, но ради новых путешественников...

У нас есть (бесплатная) библиотека слияния, доступная для скачивания в http://dilithium.co.za/info/products/gac-api/, которая делает именно это. Раскрытие информации: Да, я аффилирован. Нет, я не получу денег, если вы загрузите.; -)