Voy a tener una lista de dll en una carpeta, quiero verificar que exista o no una dll para una aplicación. Si es así, quiero agregar ese nombre de aplicación en la cuadrícula. ¿Puede alguien decir cómo hacerlo mediante programación? Gracias de antemanoProgrammatically Para verificar dll existe en Gac o no. Si es así, mostrarlo en la cuadrícula
Respuesta
Aquí está la documentación para la API GAC indocumentada: DOC: Global Assembly Cache (GAC) APIs Are Not Documented in the .NET Framework Software Development Kit (SDK) Documentation.
Esta API está diseñada para ser utilizada desde código nativo, por lo que this article podría ayudarlo a programarla desde C#.
Si buscas una solución rápida, gacutil /l
funciona.
+1 para proporcionar documentación sobre una API no documentada ... – Achilles
Normalmente, las personas suponen que el GAC se encuentra en c: \\ assembly, que es 99% verdadero. Entonces podría escribir código para iterar a través de los archivos encontrados en esa carpeta.
La forma más ortodoxa sería usar la API de Fusion, que está basada en COM. Un contenedor administrado está disponible en este sitio blog:
http://blogs.msdn.com/junfeng/archive/2004/09/14/229653.aspx
El sitio contiene también código de ejemplo que muestra cómo utilizar la API de fusión para enumerar los conjuntos instalados logró - el código es más o menos escrito para usted, por lo simplemente Ctrl + C y luego Ctrl + V ... :)
http://blogs.msdn.com/b/junfeng/archive/2004/09/14/229650.aspx
HTH ...
creo que la forma correcta es la fusión de la API COM.
Aquí cómo usarlo:
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;
}
}
}
Uso QueryAssemblyInfo
método.
HRESULT se define como un entero de 32 bits, por lo que CreateAssemblyCache y QueryAssemblyInfo deben devolver int en lugar de IntPtr. –
¿Para qué son los 'Dummy1()', 'Dummy2()' ... para? – BanksySan
Hacer una Assembly.LoadFrom y comprobar GlobalAssemblyCache
testAssembly = Assembly.LoadFrom(dllname);
if (!testAssembly.GlobalAssemblyCache)
{
// not in gac
}
¿Por qué el voto a favor? – dvallejo
No veo ninguna razón para un voto a la baja. Para mí, esta parece ser la respuesta más elegante hasta ahora, ya que no requiere cosas complejas con Fusion/COM. Esto también debería funcionar si está cargando ensamblados en el [contexto de solo reflejo] (http://msdn.microsoft.com/en-us/library/ms172331.aspx) – derabbink
Sé que esto es una cuestión de edad, sino por causa de nuevos viajeros ...
Tenemos una biblioteca de fusión (gratis) disponible para descarga en que hace exactamente esto. Divulgación: Sí, estoy afiliado. No, no recibiré dinero si lo descarga. ;-)
- 1. ¿Cómo verificar si la sesión existe o no?
- 2. ¿Cómo puedo verificar si existe o no un recurso incrustado?
- 3. ¿A GAC, o no a GAC?
- 4. ¿Cómo verificar una DLL si existe una función?
- 5. Obtener si la entrada del Registro existe si es así, si no, haga eso
- 6. ¿Es posible filtrar datos en una cuadrícula como se puede en una cuadrícula de datos? ¿Si es así, cómo?
- 7. ¿Cómo verificar un div existe o no?
- 8. LINQ para verificar si existe ID en la lista
- 9. ¿Cuál es la mejor manera de verificar si el artículo existe o no ?: Seleccione Recuento (ID) O ¿Existe (...)?
- 10. manera pitonica para verificar si algo existe?
- 11. Instalar .NET 4.0 dll en el GAC
- 12. ¿Cómo verificar utilizando la funcionalidad PHP FTP si la carpeta existe en el servidor o no?
- 13. Compruebe si existe registro, si es así "actualización" si no "insertar"
- 14. Consulta válida para verificar si existe fila en SQLite3
- 15. ¿La forma más rápida de verificar si un objeto existe en Core Data o no?
- 16. Comprobando si existe una URL o no
- 17. comprobando si existe o no un paquete
- 18. Si la sesión existe o no
- 19. ¿Cómo verificar el directorio existe o no en Linux.?
- 20. enumerando conjuntos en GAC
- 21. Llamar para verificar si existe un EGLContext actual en Android
- 22. ¿Cómo puedo verificar si existe un campo o no en MongoDB?
- 23. Verificar si la columna ya existe y si no Alter Table en sqlite
- 24. ¿Existe una forma "correcta" de hacer herencia en JavaScript? Si es así, ¿qué es?
- 25. ¿Cómo registro un archivo .NET DLL en el GAC?
- 26. ¿Existe algo así como 'if (! Page.IsPostBack)' en jQuery o javascript?
- 27. C# ¿Cómo puedo verificar si existe una URL/es válida?
- 28. ¿Es posible verificar si una notificación es visible o cancelada?
- 29. ¿Cómo verificar una cadena si es un ASCII o no?
- 30. DllImport, ¿cómo verificar si la DLL está cargada?
Si tiene una lista de archivos DLL en una carpeta, es muy poco probable que esa carpeta forme parte del GAC. –