tengo que comprobar si msdia100.dll está registrado en un sistema informático que estoy corriendo con el fin de registrar la DLL con el comando regsvr32.exe
. ¿Cómo puedo hacer eso con C#?¿Cómo se comprueba que COM dll está registrado o no con C#?
Respuesta
Puede buscar a través del registro para esto. Suponiendo que no conoce los objetos COM que figuran en el archivo DLL, primero tendrá que buscar el nombre de la DLL en HKEY_CLASSES_ROOT
.
Luego use el nombre de la clase para encontrar el CLSID en HKEY_CLASSES_ROOT\[ClassName]\CLSID
y finalmente debe poder encontrar el CLSID como HKEY_CLASSES_ROOT\CLSID\[CLSID]
.
Tenga en cuenta, ubicaciones del registro escrito de la memoria, así que puede ser un poco apagado.
Editar: O si se conoce el nombre de la clase que sólo podría tratar de crear una instancia de ella y ver si funciona o no.
Mira el rgistry en HKEY_CLASSES_ROOT \ CLSID \\ InprocServer. Si tiene ese registro, entonces la DLL debe estar registrada.
Esta es la forma correcta de hacerlo. Implica PInvoke, pero eso "solo porque no han proporcionado esta capacidad en .NET directamente.
[DllImport("kernel32")]
public extern static int LoadLibrary(string lpLibFileName);
[DllImport("kernel32")]
public extern static bool FreeLibrary(int hLibModule);
public bool IsDllRegistered(string DllName)
{
int libId = LoadLibrary(DllName);
if (libId>0) FreeLibrary(libId);
return (libId>0);
}
Los enfoques de registro están bien y vale la pena hacerlo, pero para asegurarse de que también se puede considerar una instancia de algo desde dentro del objeto COM envuelta en un intento de captura {} (COMException) {}, a continuación, presentar algo sensible al usuario si se atrapó una COMException.
Particularmente dado que el registro es mucho más complicado de lo que parece, debido a varias capas de emulación, 32/64-bit y así sucesivamente. –
Verificar si existe clave utilizando Microsoft.Win32.RegistryKey
var key = Microsoft.Win32.RegistryKey.OpenBaseKey(
Microsoft.Win32.RegistryHive.ClassesRoot,
Microsoft.Win32.RegistryView.Default)
.OpenSubKey("Interface")
//replace with your COM object GUID
.OpenSubKey("{a3560000-0000-0000-c63b3-000000cbadf0000}");
return key != null;
suponiendo que conoce el CLSID de la DLL COM, sólo puede comprobar si hay una clave con la que CLSID en HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component}
o HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component}
(Wow6432Node => 32-bit COM registrada en una máquina de 64 bits)
por 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;
}
}
Realmente aprecio su excelente código. Muchas gracias ! –
- 1. ¿Cómo puedo comprobar si un dll COM está registrado en C#
- 2. C# COM DLL: ¿uso Regasm o Regsvr32?
- 3. ¿Qué es "mejor": DLL COM o DLL estándar con Typelib?
- 4. cómo se comprueba si UIWebView está vacío o no
- 5. ¿Comprueba si IIS está instalado o no?
- 6. ¿Cómo registro una DLL COM escrita en C# con Regsvr32?
- 7. Haciendo que una DLL COM esté accesible
- 8. Determinado mediante programación si está instalada una biblioteca COM (.DLL)
- 9. Registro Com y dll manifiestos
- 10. C++ DLL no se descarga con AppDomain
- 11. ¿Este DLL está administrado o no?
- 12. ¿Cómo se crea una DLL COM en Visual Studio 2008?
- 13. registrando com dll en wix
- 14. Cómo usar COM dll en mi programa C++
- 15. Cómo determinar si DLL es COM o .NET?
- 16. ¿Cómo resuelve Unity los tipos que no se han registrado?
- 17. Tlbexp.exe en un DLL COM
- 18. ¿Cómo se comprueba si un botón está habilitado o no en Android?
- 19. C# comprueba si ha pasado o no argumentos
- 20. .NET Client crasch cuando reemplaza COM .dll registrado por uno nuevo en la misma versión de .NET como cliente
- 21. Registre un dll COM de C#/VB.NET programáticamente
- 22. Comprueba si bool está definido en C/C++
- 23. Error de clase no registrado para la instanciación del objeto C# a través de COM desde VC++
- 24. Inicialización de COM y uso en Win32 C++ DLL
- 25. Legacy VB6 COM + DLL invocando DLL Win32 nativo - ¿problemas de subprocesamiento con STA?
- 26. El objeto COM que se ha separado de su RCW subyacente no se puede usar
- 27. Cómo crear una DLL que se usará en C#
- 28. advertencia MSB3391: <DLL> no contiene ningún tipo que no se pueda registrar para la Interoperabilidad COM
- 29. ¿COM está muerto?
- 30. Comprueba si se está ejecutando un archivo exe específico
No creo que esto sea del todo correcto. Carga * cualquier * DLL, independientemente de si está registrado como servidor de un objeto COM. –
@Steve, está cargando un dll por nombre y no por una ruta completa. Si el dll carga, ha sido registrado. Si no, no ha sido registrado. A menos que el dll que estás buscando también esté en tu camino. –
Para que quede claro, LoadLibrary seguido de DllGetClassObject (con CLSID e IID de la interfaz) le proporciona una instancia de un objeto COM con el que puede jugar. Si falla la biblioteca de carga, no va a funcionar, punto. –