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#
Odpowiedz
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.
Piękna z 'Type.GetTypeFromCLSID' jest to, że zawsze zwraca System .__ ComObject niezależnie od tego, czy CLSID jest poprawny – rpattabi
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
Jeśli znasz identyfikator GUID DLL, możesz sprawdzić istnienie klucza rejestru w HKCU\SOFTWARE\Classes
.
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
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.
Erm, Twoje nadzieje, że regsvr32 będzie w stanie zarejestrować, że serwer COM powinien być cienki. Wymaga uprawnień administratora. Użyj reg-free COM. –