2010-07-09 8 views
11

Ich habe ein Office-Add-In in VS 2008, C#, .NET 3.5 und VSTO erstellt. Es wird über ClickOnce bereitgestellt. Ein Laufzeitkonfigurationsformular führt regsvr32 aus, um die im Projekt enthaltene Datei "fooapi.dll" zu registrieren, die aufgrund von ClickOnce-Einschränkungen nicht während der Installation registriert werden kann. Gibt es einen bevorzugten Weg zu überprüfen und zu sehen, ob "fooapi.dll" während der Laufzeit in C# registriert ist?Wie überprüfe ich, ob eine COM-DLL in C# registriert ist

+2

Erm, Ihre Hoffnungen von regsvr32 in der Lage zu registrieren, dass COM-Server sollte schlank sein. Es erfordert Administratorrechte. Verwenden Sie reg-freie COM. –

Antwort

4

Versuchen Sie die Type.GetTypeFromCLSID oder Type.GetTypeFromProgID Methoden, um schnell für eine COM-Schnittstelle Existenz zu überprüfen.

Alternativ können Sie das Objekt auch instanziieren und die Ausnahme abfangen, z.

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

UPDATE:

This overload scheint die einzige zu sein, die tatsächlich zurückgibt null wenn das COM-Objekt nicht instanziiert werden kann.

+2

Die Schönheit mit 'Type.GetTypeFromCLSID' ist, dass es System.__ ComObject immer zurückgibt, unabhängig davon, ob die CLSID gültig ist – rpattabi

1

Ich denke, der einfachste Weg ist zu versuchen, die Komponente zu erstellen, die in fooapi.dll lebt. Wickeln Sie den Erstellungscode in einen try/catch-Block und fangen Sie die Ausnahme ab, die generiert wird, wenn die DLL nicht ordnungsgemäß registriert ist. Dies ist der sicherste Weg, um auf korrekte Registrierung zu prüfen

2

Wenn Sie die DLLs GUID kennen, können Sie die Existenz des Registrierungsschlüssels in HKCU\SOFTWARE\Classes überprüfen.

2

Überprüfen Sie das Vorhandensein von HKEY_CLASSES_ROOT\CLSID\{your_CLSID} und die richtigen Werte darunter. Sie könnten wahrscheinlich nur nach den Werten InprocServer32 und Codebase suchen, aber Sie können sich auch für eine ausführlichere Prüfung anmelden.

Sie können auch eine Instanz der Komponente erstellen. Wenn sowohl die Komponente als auch der Client C# sind und Sie new verwenden, kann die CLR möglicherweise die richtige Assembly ermitteln und sie laden, indem sie COM durchläuft. (Ja, manchmal kann es so schlau sein :-)). Sie sollten explizit p/invoke auf CoCreateInstance

2

Wenn Sie die progID der Komponente in der DLL haben, können Sie versuchen, die Art bekommen:

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

Wenn Sie System.Runtime.InteropServices.COMException bekommen, bedeutet dies, dass die progID nicht registriert ist.

Verwandte Themen