2010-07-09 6 views
11

Utworzono dodatek do pakietu Office w VS 2008, C#, .NET 3.5 i VSTO. Jest wdrażany za pośrednictwem ClickOnce. Formularz konfiguracji czasu wykonywania wykonuje regsvr32, aby zarejestrować "fooapi.dll" dołączony do projektu, który nie może zostać zarejestrowany podczas instalacji z powodu ograniczeń ClickOnce. Czy istnieje jakiś preferowany sposób sprawdzania i sprawdzania, czy "fooapi.dll" jest zarejestrowany podczas wykonywania w C#?Jak sprawdzić, czy dll COM jest zarejestrowany w C#

+2

Erm, Twoje nadzieje, że regsvr32 będzie w stanie zarejestrować, że serwer COM powinien być cienki. Wymaga uprawnień administratora. Użyj reg-free COM. –

Odpowiedz

4

Wypróbuj metody Type.GetTypeFromCLSID lub Type.GetTypeFromProgID, aby szybko sprawdzić istnienie interfejsu COM.

Alternatywnie, po prostu wykonaj instancję obiektu i zatrzymaj wyjątek, np.

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

UPDATE:

This overload wydaje się być jedynym, który faktycznie zwraca null jeśli obiekt COM nie może być instancja.

+2

Piękna z 'Type.GetTypeFromCLSID' jest to, że zawsze zwraca System .__ ComObject niezależnie od tego, czy CLSID jest poprawny – rpattabi

1

Myślę, że najprostszym sposobem jest próba utworzenia komponentu, który żyje w pliku fooapi.dll. Zawiń kod kreacji w bloku try/catch i wychwytuj wyjątek, który jest generowany, jeśli biblioteka DLL nie została poprawnie zarejestrowana. Jest to najpewniejszy sposób sprawdzenia poprawności rejestracji

2

Jeśli znasz identyfikator GUID DLL, możesz sprawdzić istnienie klucza rejestru w HKCU\SOFTWARE\Classes.

2

Sprawdź obecność HKEY_CLASSES_ROOT\CLSID\{your_CLSID} i odpowiednich wartości pod nim. Prawdopodobnie możesz uciec od szukania tylko wartości InprocServer32 i Codebase, ale możesz też wyrazić zgodę na bardziej szczegółowe sprawdzenie.

Można także po prostu utworzyć instancję komponentu. Jeśli jednak zarówno składnik, jak i klient są C# i używasz new, CLR może być w stanie znaleźć odpowiedni zestaw i załadować go przechodząc przez COM. (Tak, czasami może być tak sprytnie :-)). Powinieneś jawnie p/invoke do CoCreateInstance

2

Jeśli masz PROGID komponentu w bibliotece DLL, można spróbować coraz Typ:

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

Jeśli masz System.Runtime.InteropServices.COMException, oznacza to, że PROGID nie jest zarejestrowany.

Powiązane problemy