Jak rozwiązać niezarejestrowaną klasę wyjątku COM (wyjątek od HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?


93

Kiedy próbuję utworzyć wystąpienie klasy COM, zgłasza wyjątek jako

Klasa niezarejestrowana (wyjątek od HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Proszę zasugerować, jak mogę to rozwiązać?


1
Czy możesz podać więcej szczegółów za pomocą jakiegoś kodu?
Xaisoft

10
Są dwa pytania: 1. Czy zainstalowałeś / zarejestrowałeś składnik COM na komputerze z systemem Windows 7 x64? 2. Jaką platformę docelową Twojej aplikacji, myślę, że powinieneś ustawić platformę na x86, proszę nie ustawiać jej jako „Any CPU”? Najpierw zarejestruj COM, a następnie uruchom, aby przetestować aplikację, zapoznaj się z dokumentem: support.microsoft.com/kb/146219 i Wyjaśnieniem użycia Regsvr32 i komunikatów o błędach
JackWang

Rozwiązałem to bez zmiany celu kompilacji na „x86”. Rozwiązanie w linku: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Odpowiedzi:


49

Wygląda na to, że którykolwiek program lub proces, który próbujesz zainicjować, nie jest zainstalowany na Twoim komputerze, ma uszkodzoną instalację lub musi zostać zarejestrowany.

Zainstaluj go, napraw (za pomocą Dodaj / usuń programy) lub zarejestruj (za pomocą programu Regsvr32.exe).

Nie dostarczyłeś wystarczająco dużo informacji, abyśmy mogli Ci pomóc.


4
Myślisz, że miałeś na myśli RegSvr32.exe (w przeciwieństwie do RegSrv32.exe).
windowsgm

60

Musisz upewnić się, że wszystkie zestawy są kompilowane pod kątem poprawnej architektury. Spróbuj zmienić architekturę dla x86, jeśli ponowna instalacja składnika COM nie działa.


To rozwiązało mój proces, nie znajdując klienta NAV 2009 R2 (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Vincent Vancalbergh

14

Mój problem i rozwiązanie

Mam 32-bitową bibliotekę DLL innej firmy, którą zainstalowałem na maszynie 2008 R2, która jest 64-bitowa.

Mam usługę wcf utworzoną w ramach .NET 4.5, która wywołuje 32-bitową bibliotekę DLL innej firmy dla procesu. Teraz mam właściwość budowania ustawioną na docelowy „dowolny” procesor i wdrożyłem ją na komputerze 64-bitowym.

gdy próbowałem wywołać usługę wcf, wystąpił błąd „80040154 Niezarejestrowana klasa (wyjątek od HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG”)

Teraz użyłem ProcMon.exe do prześledzenia problemu z rejestrem com i stwierdziłem, że proces szuka wpisu rejestru w HKLM \ CLSID i HKCR \ CLSID, gdzie nie ma wpisu.

Dowiedziałem się, że Microsoft nie zarejestruje 32-bitowych komponentów com w ścieżkach HKLM \ CLSID, HKCR \ CLSID na komputerze 64-bitowym, ale umieści wpis w ścieżkach HKLM \ Wow6432Node \ CLSID i HKCR \ Wow6432Node \ CLSID.

Teraz konflikt jest procesem 64-bitowym próbującym wywołać proces 32-bitowy na komputerze 64-bitowym, który będzie szukał wpisu rejestru w HKLM \ CLSID, HKCR \ CLSID. Rozwiązanie polega na tym, że musimy zmusić proces 64-bitowy, aby spojrzał na wpis rejestru w HKLM \ Wow6432Node \ CLSID i HKCR \ Wow6432Node \ CLSID.

Można to osiągnąć, konfigurując właściwości projektu usługi wcf tak, aby były kierowane na maszynę „X86” zamiast „Any”.

Po wdrożeniu wersji „X86” na serwerze 2008 R2 pojawił się problem „System.BadImageFormatException: Could not load file or assembly”

Rozwiązaniem tego badimageformatexception jest ustawienie „Enable32bitApplications” na „True” we właściwościach IIS Apppool dla odpowiedniej puli aplikacji.


Nie publikuj identycznych odpowiedzi na wiele pytań. Opublikuj jedną dobrą odpowiedź, a następnie zagłosuj / oflaguj, aby zamknąć pozostałe pytania jako duplikaty. Jeśli pytanie nie jest powtórzeniem, dostosuj swoje odpowiedzi do pytania .
kleopatra

10

Należy również zauważyć, że kontekst klasy podczas inicjowania może utworzyć ten wyjątek. Jeśli masz obiekt, który jest zakodowany jako INPROC_SERVER, ale spróbujesz CoCreateInstance jako CLSCTX_LOCAL_SERVER, również otrzymasz ten błąd.

Musisz upewnić się, że obiekt jest zarejestrowany, a CoCreateInstance tworzy instancję z odpowiednim kontekstem klasy.


Tak, jeśli na przykład spróbujesz utworzyć DesktopWallpaperza pomocą CLSCTX_INPROC(zamiast CLSCTX_ALL), otrzymasz 0x80040154 (REGDB_E_CLASSNOTREG)błąd.
user362515

9

Jeśli używasz 64-bitowych składników COM w aplikacji sieci Web w usługach IIS, upewnij się, że pula aplikacji nie zezwala na aplikacje 32-bitowe ( Włącz aplikacje 32-bitowe: fałsz w ustawieniach zaawansowanych)


5

Uruchomiłem go, włączając aplikacje 32-bitowe w ustawieniach zaawansowanych puli aplikacji. Kliknij prawym przyciskiem myszy pulę aplikacji i wybierz ustawienia zaawansowane - włącz aplikacje 32-bitowe. To może komuś pomóc.


Dla mnie to samo. 32-bitowy plik dll używany na 64-bitowej maszynie deweloperskiej, 64-bitowy test i 64-bitowy serwer na żywo. Działa dobrze na dev boxie. Po wdrożeniu na serwerach testowych i na żywo kończyło się niepowodzeniem, dopóki aplikacje 32-bitowe nie zostały dopuszczone w odpowiednich pulach aplikacji usług IIS, a pule zostały ponownie uruchomione. Musiałem również wyłączyć opcję „Embed Interop Types” (ustawienie w szkodliwej bibliotece dll w VS) i ustawić „Copy Local” = true, aby upewnić się, że biblioteka dll została faktycznie skopiowana w oryginalnej postaci na serwery.
cymorg

3

Rejestrując klasę (a konkretnie jej CLSID) - zobacz np . Tutaj .


Czy może to być również jakiś obiekt, który trzeba zainstalować na jego komputerze lub serwerze, niekoniecznie rejestracja klasy.
Xaisoft

@Xaisoft, „instalacja” zazwyczaj wiąże się z „rejestracją”, o czym wspomina adres URL MSDN, o którym wspomniałem.
Alex Martelli,

3

w moim przypadku

my platform to x64

the Dll library(sdk)a redistributable packagejest x64

więc

  1. w eksploratorze rozwiązań navigate to your project

  2. otwarty Properties

  3. change the Platform target from AnyCPU to x64

wprowadź opis obrazu tutaj


2

Sposób, w jaki rozwiązałem ten problem, polegał na zarejestrowaniu domeny COMvia regsvr32.

upewnij się, że wywoływany model COM jest zarejestrowany.

Moja aplikacja korzystała, xceedcry.dlla ja jej nie rejestrowałem. Po zarejestrowaniu aplikacja działała dobrze.


2

Moim rozwiązaniem była zmiana opcji „ Włącz aplikacje 32-bitowe ” na True w ustawieniach zaawansowanych odpowiedniej puli aplikacji w usługach IIS.

Pula aplikacji

Włącz aplikacje 32-bitowe


2

W moim przypadku klasa została poprawnie zarejestrowana i zbudowana w DOWOLNYM trybie CPU / 64-bitowym .

Ale Enable 32-bitowych aplikacji własność puli aplikacji IIS z aplikacji, która używa klasy została ustawiona na wartość True .

Nie znaleziono klasy z powodu niezgodności architektury między konfiguracją puli aplikacji a rzeczywistą zarejestrowaną klasą.

Ustawienie opcji Włącz aplikacje 32-bitowe na Fałsz rozwiązało problem. Ustawienia puli aplikacji usług IIS



1

Miałem ten sam problem, używając MapWinGis. Znalazłem rozwiązanie, pracując nad projektami formularzy Windows Visual Studio 2015, po prostu kliknij prawym przyciskiem myszy na proyect-> properties-> Build, ustaw konfigurację na Wszystkie konfiguracje, a w „platformie target” conbobox ustaw ją na x64.


0

Napotkałem ten problem, wywołując zestaw .Net z klienta C ++ przez COM. Okazuje się, że nie można znaleźć jednego z zestawów, od których zależał zestaw .Net. Przez chwilę walczyłem, próbując dowiedzieć się, co jest nie tak z pierwszym montażem, ale w rzeczywistości była to jedna z zależności pierwszego zgromadzenia. Otrzymałem dwa różne błędy podczas wywoływania CoCreateInstance () z klienta C ++. Pierwsza to: REGDB_E_CLASSNOTREG Klasa niezarejestrowana, a druga próba: 0x80131040: definicja manifestu zlokalizowanego zestawu nie jest zgodna z odwołaniem do zestawu.

Sprawdź więc, czy istnieją odwołania do zestawu. Odkryłem to, przeglądając pierwszy zestaw za pomocą dotPeek i zauważając, że brakuje jednego z jego odniesień. Umieszczenie poprawnej wersji zależności w folderze rozwiązało oba błędy.


0

Kompilowałem swoją aplikację pod kątem dowolnego procesora i głównym problemem okazało się, że zainstalowano program Adobe Reader, starsza wersja 10.x wymaga aktualizacji wersji 11.x , w ten sposób mogę rozwiązać ten problem.


0

Napotkałem ten sam problem, używając klasy COM, tj. „Wyjątek niezarejestrowany w klasie” w czasie wykonywania. Dla mnie udało mi się rozwiązać, przechodząc do pliku app.config i zmieniając elementy „startup” i „supportedRuntime” na coś takiego:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Możesz przeczytać więcej o szczegółach tutaj http://stackoverflow.com/questions/1604663/

a tutaj https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

Powinienem zauważyć, że używam Visual Studio 2017. Docelowy procesor = x86 Embed Interop Type = true (w oknie właściwości)


0

przejdź do katalogu platformy .Net i zarejestruj odpowiednią bibliotekę dll za pomocą ścieżki dll białej przestrzeni Regsvr32.exe .


0

Zmierzyłem się z tym samym problemem. Po przeprowadzeniu pewnych badań znalazłem dla mnie poprawkę i może to być przydatne. Z moich obserwacji problem dotyczy nie tylko ponownej instalacji, zależy również od uprawnień dostępu.

Krok 1: Napraw konkretny obiekt COM.

Krok 2: Usługi składowe> Komputery> Mój komputer> Konfiguracja DCOM> Wybierz obiekt COM> kliknij prawym przyciskiem myszy> Właściwości> karta Zabezpieczenia> Uprawnienia dostępu> Wybierz Dostosuj> Kliknij EDYTUJ> Wybierz IIS_USER (jeśli nie istnieje, utwórz z pełnymi uprawnieniami) i podaj pełne dostęp i kliknij OK.

Przejdź do karty Tożsamość> Możesz wybrać „Użytkownik interaktywny” lub „Ten użytkownik”> Kliknij Zastosuj i OK. Jeśli wybierzesz „Ten użytkownik”, musimy nadać temu serwerowi uprawnienia administratora

Krok 3: Otwórz Menedżera usług IIS> Uruchom ponownie pule aplikacji.

Uwaga: W razie potrzeby zrestartuj serwer


-1

Tutaj znajdź rozwiązanie, uruchom narzędzie mmc -32 (nie dcomcfg)

W 64-bitowym systemie z 32-bitowym pakietem Office spróbuj tego:

Start
Run
mmc -32
File
Add Remove Snap-in
Component Services
Add
OK
Console Root
Component Services
Computers
My Computer
DCOM Config
Microsoft Excel Application

wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.