¿Cómo comprobar si un archivo DLL está registrado?

¿Cómo puedo saber si un archivo DLL escrito en C # está registrado o no de forma programática?

Ya probé este código, pero no sale.

Si registro un archivo DLL y comprobo usando este código, regresa. Si elimino el registro y ejecuto este mismo fragmento de código, vuelve a ser verdadero. Estoy dando el camino completo del archivo DLL como argumento.

Desarrollamos un archivo DLL simple en Visual C ++ . Después de eso lo registramos. Ahora queremos confirmar si está registrado.

Bob, ¿reemplazarás el trozo de código por tu cuenta, todavía es difícil para mí?

Si registro un archivo DLL, ¿hay una entrada presente en el registro? ¿Encontraré esas entradas y juzgaré si el archivo DLL está registrado o no?

La última respuesta está trabajando con algunas modificaciones. Busqué en typelib en lugar de clsid.

Earwicker der: De todos modos, lo he hecho con una ligera modificación. Está funcionando ahora.

Debe averiguar el GUID de un objeto COM definido en la DLL. Luego mira esta clave de registro:

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32 

Reemplace las x con el GUID.

Debe tener un valor predeterminado que contenga la ruta completa a la DLL.

Si quiere decir registrado en GAC, aquí está mi consideración: para estar registrado en GAC, una asamblea debe estar firmada con un nombre fuerte (tener un token de clave pública en su nombre).

Entonces puede intentar cargarlo usando Assembly.Load(string) , si tiene FileNotFoundException – el ensamblado no se registró en GAC.

Si no se obtiene ningún error, pero el resultado Assembly.GetName().GetPublicKeyToken() es nulo o está vacío: esto significa que encontró el ensamblado en el directorio de la aplicación, no en el GAC.

Puedes usar esto:

 My.Computer.Registry.ClassesRoot.GetSubKeyNames.Contains("gEncrypt.clsEncrypt") 

Donde “gEncrypt.clsEncrypt” es ComName.ClassName.

 class TestDll { //Import your tested DLL here [DllImport("kernel32")] public extern static int LoadLibrary(string lpLibFileName); } try { TestDll test = new TestDll(); } catch(DllNotFoundException ex) { return false; } 

Si conoce el CLSID de la dll COM, puede verificar si hay una clave con ese CLSID en HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component} o HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component} (Wow6432Node => COM de 32 bits registrado en una máquina de 64 bits)

Aquí hay un ejemplo:

 private bool IsAlreadyRegistered() { using (var classesRootKey = Microsoft.Win32.RegistryKey.OpenBaseKey( Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default)) { const string clsid = "{12345678-9012-3456-7890-123456789012}"; var clsIdKey = classesRootKey.OpenSubKey(@"Wow6432Node\CLSID\" + clsid) ?? classesRootKey.OpenSubKey(@"CLSID\" + clsid); if (clsIdKey != null) { clsIdKey.Dispose(); return true; } return false; } } 
 [DllImport("kernel32")] public extern static bool FreeLibrary(int hLibModule); [DllImport("kernel32")] public extern static int LoadLibrary(string lpLibFileName); public bool IsDllRegistered(string DllName) { int libId = LoadLibrary(DllName); if (libId>0) FreeLibrary(libId); return (libId>0); } 
  1. Declarar un puntero a la interfaz
  2. Llamar a CoCreateInstance en el CLSID y IID
  3. Si el valor de retorno no es S_OK, la clase no está registrada