Necesito comprobar si msdia100.dll está inscrita en un sistema informático que estoy corriendo con el fin de registrar la dll con el comando regsvr32.exe. Cómo puedo hacer que con C#?

InformationsquelleAutor prosseek | 2011-02-11

6 Comentarios

  1. 3

    Usted puede buscar a través de el registro de este. Suponiendo que usted no sabe que los objetos COM contenida en el archivo DLL vas a tener que empezar a buscar el nombre de la DLL primera en HKEY_CLASSES_ROOT.

    A continuación, utilizar el nombre de clase para encontrar el CLSID en HKEY_CLASSES_ROOT\[ClassName]\CLSID y, finalmente, usted debería ser capaz de encontrar el CLSID como HKEY_CLASSES_ROOT\CLSID\[CLSID].

    Tenga en cuenta, ubicaciones del registro escrito de memoria, por lo que podría ser un poco apagado.

    Edit: O si usted sabe el nombre de la clase que sólo podría intentar crear una instancia de ella y ver si funciona o no.

  2. 4

    El registro enfoques son buenos y vale la pena hacerlo, pero para estar seguro de que usted también podría considerar la posibilidad de crear instancias de algo desde dentro del objeto COM envuelto en un try {} catch (COMException) {}, luego de presentar algo sensible para el usuario si se produce una COMException atrapado.

    • Especialmente desde que el registro es mucho más complicado de lo que parece, debido a las varias capas de la emulación, de 32/64 bits y así sucesivamente.
  3. 4

    Asumir que usted sabe el CLSID de la dll de COM, usted 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 => COM de 32 bits registrado 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 !
  4. 2

    Verificar si existe la clave del uso de 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;
  5. 1

    Vistazo a la rgistry en HKEY_CLASSES_ROOT\CLSID\\InprocServer. Si usted tiene que registrar, a continuación, el archivo DLL debe estar registrado.

  6. -1

    Esta es la forma correcta de hacerlo. Implica PInvoke pero que » sólo porque ellos no proporcionan esta capacidad .RED 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);    
    }
    • Yo no creo que esto sea del todo correcta. Carga alguna DLL, independientemente de si está registrado como alojamiento de un objeto COM.
    • se carga una dll por su nombre y no la ruta completa. Si se carga la dll se ha registrado. Si no, no se ha registrado. A menos que el archivo dll se está buscando también pasa a estar en su camino.
    • Para ser claros, LoadLibrary seguido por DllGetClassObject (con CLSID y IID de la interfaz) le da a usted y a instancia de un objeto COM que puede jugar. Si la carga de la biblioteca de falla, no va a funcionar, y punto.
    • Si se carga la DLL, es debido a que el archivo DLL se encuentra en el camino. Si se le cae la DLL en el directorio actual o en C:\Windows\System32 o en cualquier otro lugar donde se puede encontrar, entonces LoadLibrary de trabajo. En ese punto, por lo que se DllGetClassObject, pero esto no nos dice nada. Quien upvoted que estaba equivocado.

Dejar respuesta

Please enter your comment!
Please enter your name here