2010-07-09 22 views
11

Ho creato un componente aggiuntivo di Office in VS 2008, C#, .NET 3.5 e VSTO. Viene distribuito tramite ClickOnce. Un modulo di configurazione run-time esegue regsvr32 per registrare "fooapi.dll" incluso nel progetto che non può essere registrato durante l'installazione a causa delle limitazioni di ClickOnce. C'è un modo preferibile per controllare e vedere se "fooapi.dll" è registrato durante l'esecuzione in C#?Come verificare se una DLL COM è registrata in C#

+2

Erm, le tue speranze di regsvr32 di poter registrare il server COM dovrebbero essere ridotte. Richiede i privilegi di amministratore. Utilizzare COM reg-free. –

risposta

4

Provare i metodi Type.GetTypeFromCLSID o Type.GetTypeFromProgID per verificare rapidamente l'esistenza di un'interfaccia COM.

In alternativa, basta istanziare l'oggetto e intrappolare l'eccezione, ad es.

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

UPDATE:

This overload sembra essere l'unico che in realtà ritorna null se l'oggetto COM non può essere istanziato.

+2

La bellezza con 'Type.GetTypeFromCLSID' è che restituisce sempre System .__ ComObject indipendentemente dal fatto che il CLSID sia valido – rpattabi

1

Penso che il modo più semplice sia provare e creare il componente che vive in fooapi.dll. Avvolgi il codice di creazione in un blocco try/catch e cattura l'eccezione che viene generata se la DLL non è registrata correttamente. Questo è il modo più sicuro per verificare la registrazione corretta

2

Se si conosce il GUID delle DLL, è possibile verificare l'esistenza della chiave di registro in HKCU\SOFTWARE\Classes.

2

Verificare la presenza di HKEY_CLASSES_ROOT\CLSID\{your_CLSID} e i valori corretti sotto di esso. Probabilmente potresti andare via con la ricerca dei valori InprocServer32 e Codebase, ma potresti anche optare per un controllo più approfondito.

È anche possibile creare un'istanza del componente. Tuttavia, se sia il componente che il client sono C# e si utilizza new, il CLR potrebbe essere in grado di calcolare l'assembly corretto e caricarlo passando attraverso COM. (Sì, può essere intelligente come quello a volte :-)). È necessario p/invocare esplicitamente a CoCreateInstance

2

Se avete il ProgID del componente nella DLL, si può provare a ottenere la Type:

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

Se si ottiene System.Runtime.InteropServices.COMException, significa che il ProgID non è registrato.

Problemi correlati