2010-07-09 22 views
11

Creé un complemento de Office en VS 2008, C#, .NET 3.5 y VSTO. Se implementa a través de ClickOnce. Un formulario de configuración en tiempo de ejecución ejecuta regsvr32 para registrar "fooapi.dll" incluido con el proyecto que no se puede registrar durante el instal debido a las limitaciones de ClickOnce. ¿Hay alguna forma preferida de verificar y ver si "fooapi.dll" está registrado durante el tiempo de ejecución en C#?¿Cómo puedo comprobar si un dll COM está registrado en C#

+2

Erm, sus esperanzas de que regsvr32 sea capaz de registrar ese servidor COM deberían ser escasas. Requiere privilegios de administrador. Use COM sin registro. –

Respuesta

4

Pruebe los métodos Type.GetTypeFromCLSID o Type.GetTypeFromProgID para comprobar rápidamente la existencia de una interfaz COM.

O bien, solo crea una instancia del objeto y atrapa la excepción, p.

catch(COMException ex) { 
    if(ex.ErrorCode == -2147221164) { 
     // Retrieving the COM class factory for component with CLSID XXXX failed 
    } 
} 

ACTUALIZACIÓN:

This overload parece ser el único que en realidad vuelve null si el objeto COM no se pueden crear instancias.

+2

La belleza con 'Type.GetTypeFromCLSID' es que siempre devuelve System .__ ComObject independientemente de si el CLSID es válido – rpattabi

1

Creo que la manera más simple es tratar de crear el componente que se encuentra en fooapi.dll. Envuelva el código de creación en un bloque try/catch y capture la excepción que se genera si el archivo DLL no está registrado correctamente. Esta es la forma más segura de verificar el registro correcto

2

Si conoce el GUID de las DLL, puede verificar la existencia de la clave de registro en HKCU\SOFTWARE\Classes.

2

Compruebe la presencia de HKEY_CLASSES_ROOT\CLSID\{your_CLSID} y los valores adecuados debajo de ella. Probablemente pueda salirse con la suya buscando valores de InprocServer32 y Codebase solamente, pero también puede optar por un control más extenso.

También puede simplemente crear una instancia del componente. Sin embargo, si tanto el componente como el cliente son C# y usted usa new, el CLR podría ser capaz de determinar el ensamblaje apropiado y cargarlo con COM. (Sí, puede ser inteligente así a veces :-)). Debería invocar explícitamente p/invocar a CoCreateInstance

2

Si tiene el ProgID del componente en el archivo DLL, puede intentar conseguir el Tipo:

System.Type.GetTypeFromProgID(string progID, bool throwOnError) 

Si obtiene System.Runtime.InteropServices.COMException, significa que el ProgID no está registrado.

Cuestiones relacionadas