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#
risposta
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.
La bellezza con 'Type.GetTypeFromCLSID' è che restituisce sempre System .__ ComObject indipendentemente dal fatto che il CLSID sia valido – rpattabi
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
Se si conosce il GUID delle DLL, è possibile verificare l'esistenza della chiave di registro in HKCU\SOFTWARE\Classes
.
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
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.
Erm, le tue speranze di regsvr32 di poter registrare il server COM dovrebbero essere ridotte. Richiede i privilegi di amministratore. Utilizzare COM reg-free. –