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.
- 1. Determina se una libreria COM (.DLL) è installata
- 2. Come determinare se la DLL è COM o .NET?
- 3. Come registrare una DLL COM scritta in C# con Regsvr32?
- 4. registrazione com dll in wix
- 5. Come verificare se un tipo è una stringa in C#?
- 6. Utilizzo di tlbexp.exe su una DLL COM
- 7. È possibile chiamare una DLL C# da una DLL C?
- 8. Debug C# dll dalla soluzione C++ tramite COM
- 9. Come verificare una firma digitale di una DLL in .NET
- 10. Verificare se la pagina Facebook di Facebook è stata registrata come utente
- 11. Il modo migliore per verificare se un file DLL è un assembly CLR in C#
- 12. Come verificare se una NSWindow è visibile
- 13. Come verificare se una stringa è bilanciata?
- 14. Come verificare se una struttura è inizializzata?
- 15. Carica una DLL COM in fase di runtime?
- 16. Come utilizzare Dll COM di registrazione gratuita in dot net
- 17. Come verificare se un eseguibile o una DLL è compilato in modalità di rilascio o debug (C++)
- 18. Come verificare se una tela è vuota?
- 19. Come verificare se è installato un servizio Windows in C#
- 20. Laravel 5, controlla se la classe è registrata nel container
- 21. In C#, come verificare se una stringa contiene un intero?
- 22. Come verificare se un socket è collegato/disconnesso in C#?
- 23. Come verificare se un file è già aperto in C
- 24. Come verificare se la directory è nascosta in C#?
- 25. Come verificare se array vuoto in C
- 26. COM msado15.dll Il programma è stato arrestato
- 27. Come usare una dll C++ in Unity3D?
- 28. Perché C# ha bisogno di registrare DLL COM per fare riferimento ad esso?
- 29. Controllare se Windsor ha una componente di corrispondenza registrata
- 30. Come verificare se una struttura è NULL in C o C++
Erm, le tue speranze di regsvr32 di poter registrare il server COM dovrebbero essere ridotte. Richiede i privilegi di amministratore. Utilizzare COM reg-free. –