Programaticamente Para verificar dll existe no Gac ou não.Se assim exibi-lo na grade

Eu vou ter uma lista de dll em uma pasta, eu quero verificar uma dll para um aplicativo existe ou não. Se assim for, eu quero adicionar esse nome de aplicativo na grade. Qualquer um pode dizer como fazer isso programaticamente. Desde já, obrigado

Faça um assembly.LoadFrom e verifique GlobalAssemblyCache

testAssembly = Assembly.LoadFrom(dllname); if (!testAssembly.GlobalAssemblyCache) { // not in gac } 

Eu acho que a maneira correta é a API Fusion COM.

Aqui como usá-lo:

 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; } } } 

Use o método QueryAssemblyInfo .

Aqui está a documentação para a API do GAC não documentada: DOC: APIs de cache de assembly global (GAC) não estão documentadas na documentação do SDK (Software Development Kit) do .NET Framework .

Esta API foi projetada para ser usada a partir de código nativo, portanto, este artigo pode ajudá-lo a programá-lo a partir de C #.

Se você está procurando uma solução rápida, o gacutil /l funciona.

Normalmente, as pessoas supõem que o GAC está localizado em c: \\ assembly, que é 99% verdadeiro. Então você poderia escrever código para percorrer os arquivos encontrados naquela pasta.

A maneira mais ortodoxa seria usar a Fusion API, que é baseada em COM. Um wrapper gerenciado está disponível neste blog:

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

O site também contém exemplos de código gerenciado mostrando como usar a Fusion API para enumerar os assemblies instalados – o código é muito bem escrito para você, então apenas ctrl + c e depois ctrl + v … 🙂

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

HTH …

Eu sei que esta é uma questão antiga, mas para novos viajantes …

Temos uma biblioteca de fusão (gratuita) disponível para download em http://dilithium.co.za/info/products/gac-api/ que faz exatamente isso. Divulgação: Sim, sou afiliado. Não, eu não vou conseguir dinheiro se você baixar. 😉