Pobieranie fabryki klasy COM dla komponentu z CLSID {XXXX} nie powiodło się z powodu następującego błędu: 80040154


278

Opracowałem usługę Windows za pomocą C # .NET do generowania raportu PDF. Aby wygenerować plik PDF, korzystam z biblioteki DLL innej firmy. Aplikacja działa na mojej platformie Windows XP. Kiedy wdrożyłem usługę w 64-bitowej wersji systemu Windows Server 2008 , otrzymałem ten błąd:

Pobieranie fabryki klasy COM dla komponentu z CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} nie powiodło się z powodu następującego błędu: 80040154.

Zarejestrowałem bibliotekę DLL za pomocą polecenia regsvr32. Widzę ten CLSID w rejestrze. Ale problem utrzymuje się.

Co może być problemem?


1
Aplikacja internetowa hostowana na tym samym serwerze jest w stanie wygenerować plik PDF bez żadnego błędu.
— gopal

Chłopaki próbowałem każdego możliwego rozwiązania, ale wciąż pojawia się ten błąd. Mam zespoły i zarejestrowałem je pomyślnie, ale wciąż pojawia się ten sam błąd. Naprawdę potrzebuję pomocy ...
— newprogress

Odpowiedzi:


383

W VS - właściwości projektu - w zakładce Kompilacja - cel platformy = X86


7
w VS2008 znalazłem tę opcję w „Kompiluj-> Zaawansowane opcje kompilacji ...” (na dole zakładki okna), a potem „Docelowy procesor” (x86)
— Rodolfo

1
Zasługujesz na więcej niż +1, ale +1 to wszystko, co muszę dać
— David

7
To nie zawsze jest rozwiązanie.

2
Uratowałeś mi siedem zagranicznych kont bankowych, stoisko z hot dogami i moje małżeństwo. Dziękuję
— Donald.Record

2
Mam ten sam komunikat o błędzie, ale to rozwiązanie nie działa dla mnie.
— Akram Khan

59

Natrafiłem na bardzo podobny problem.

Musiałem użyć starej 32-bitowej biblioteki DLL w aplikacji sieci Web rozwijanej na komputerze 64-bitowym. Zarejestrowałem 32-bitową bibliotekę DLL w folderze Windows \ sysWOW64 przy użyciu wersji regsrv32 w tym folderze.

Wywołania do biblioteki DLL innej firmy działały na podstawie testów jednostkowych w Visual Studio, ale nie powiodły się z aplikacji sieci Web hostowanej w IIS na tym samym komputerze z błędem 80040154.

Zmiana puli aplikacji na „Włącz aplikacje 32-bitowe” rozwiązała problem.


1
To najłatwiejszy sposób na rozwiązanie tego problemu. Dzięki!
— dexter

6
Naprawdę uwielbiam tę odpowiedź. Nie ma sensu kompilować całej strony dla x86, gdy w pewnym momencie wywołujesz tylko jedną małą 32-bitową bibliotekę DLL.
— DanM7

@Daniel Ballinger Czy po wprowadzeniu zmiany moja aplikacja działałaby jako 32-bitowy proces?
— Nowicjusz

@Danny Nie sądzę, ponieważ nie będzie miał dostępu do biblioteki DLL, którą zarejestrowałem w sysWOW64.
— Daniel Ballinger

1
Mam ten sam problem, ale nie wiem, jak zmienić pulę aplikacji, gdzie mam to zrobić, proszę mi pomóc
— Shima.Y

58

Wygląda na to, że twoja usługa została zbudowana na „Any CPU”, co powoduje błędy w 64-bitowych miejscach, w których używasz komponentów COM. Musisz to zbudować x86.

Witryna prawdopodobnie działa jako proces 32-bitowy i dlatego może korzystać z tego komponentu. Zbudowanie rozwiązania x86wymusi uruchomienie usługi w wersji 32-bitowej.


Mam również ten sam problem .. tam, gdzie moja aplikacja komputerowa została pomyślnie zainstalowana w systemie 64-bitowym. Podczas instalacji pomyślnie wykonałem synchronizację, ale kiedy wykonuję synchronizację z mojego oprogramowania, pokazuje mi to powyżej błędu
— Mohini Mhetre

Próbuję się zarejestrować, .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)ale pojawia się błąd Nie można załadować modułu. Upewnij się, że plik binarny jest zapisany pod określoną ścieżką lub debuguj go, aby sprawdzić problemy z plikami binarnymi lub zależnymi .DLL.
— Naveen Kumar

A jeśli jest skompilowany jako 32-bitowy, należy użyć System regsvr32, a nie wersji SysWow64.
— Fandango68,

Otrzymuję ten błąd podczas uruchamiania pakietu SSIS. Połączenia działają dobrze. Wszystkie właściwości są poprawne. W rzeczywistości pakiet SSIS działał od wielu miesięcy bez żadnego błędu. Nagle dostaję błąd. Próbowałem zmienić środowisko uruchomieniowe / debugowanie na x86 z x64 nadal problem nie został rozwiązany.
— IamVISH

16

Nie musisz konfigurować docelowej platformy właściwości projektu X86. Możesz także skonfigurować opcje iis do pracy z taką wersją x86

  • Wybierz Pula aplikacji
  • Wybierz pulę, z której korzysta Twoja aplikacja
  • Zaawansowane ustawienia
  • Włącz 32-bitowe aplikacje true

To zawsze było dla mnie prawdziwe. Nigdy nie musiałem ustawiać docelowej platformy na X86, ale zawsze • Włącz 32-bitowe aplikacje = True • Ustaw tożsamość = ApplicationPoolIdentity • Załaduj profil użytkownika = True
— Zath.

Miałem podobny problem, który został naprawiony zgodnie z instrukcjami Nazima, ale musiałem też nie „Osadzać typów interopów” (właściwość przywoływanej biblioteki dll) i ustawić Copy Local = true.
— cymorg

Jak „wybrać pulę aplikacji”?
— CodyBugstein,

Menu Baseny aplikacji znajduje się na liście menu iis po lewej
— nazim hatipoglu

16

Jeśli szukasz sposobu na wykonanie tej pracy bez ponownej kompilacji aplikacji Any CPU, oto inne potencjalne obejście:

  1. Zlokalizuj identyfikator GUID obiektu COM pod HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Po zlokalizowaniu dodaj nową wartość REG_SZ (string). Nazwą powinien być AppID, a dane powinny być tym samym GUID obiektu COM, którego właśnie szukałeś
  3. Dodaj nowy klucz w obszarze HKey_Classes_Root \ Wow6432Node \ AppID. Nowy klucz powinien być nazwany tak samo jak GUID obiektu COM.
  4. Pod nowo dodanym kluczem dodaj nową wartość ciągu i nazwij ją DllSurrogate. Pozostaw wartość pustą.
  5. Utwórz nowy klucz w HKey_Local_Machine \ Software \ Classes \ AppID \ Znowu nowy klucz powinien być nazwany tak samo jak GUID obiektu COM. W tym kluczu nie trzeba dodawać żadnych wartości.

Nie biorę uznania za rozwiązanie, ale zadziałało dla nas. Sprawdź link źródłowy, aby uzyskać więcej informacji i inne komentarze.

Źródło: https://techtalk.gfi.com/32bit-object-64bit-environment/


1
Najbardziej doskonałe instrukcje. Korzystałem z narzędzia innej firmy, co uniemożliwiło mi zmianę platformy kompilacji. To rozwiązanie pozwoliło obejść ten problem. Dziękuję Ci!

Znalazłem klucz, jak opisano w kroku 1, a potem wiedziałem, który obiekt COM sprawia problemy, po prostu uruchamiam na nim regsvr32. Wielkie dzięki!
— MichaelS

Gdy to zrobiłem, mój lokalny serwer internetowy (IIS) zaczął otrzymywać odmowę dostępu. To mówi mi, że był to krok we właściwym kierunku, ale nie jestem pewien, do kogo w tym momencie dać dostęp. stackoverflow.com/questions/14019401/…
— user420667

14

Problem polega na tym, że proces serwera jest 64-bitowy, a biblioteka 32-bitowa i próbuje utworzyć komponent COM w tym samym procesie (serwer in-proc). Albo przekompilujesz serwer i uczynisz go 32-bitowym, albo pozostawisz serwer niezmieniony i sprawisz, że składnik COM nie będzie przetwarzany. Najłatwiejszym sposobem na wyłączenie serwera COM z procesu jest utworzenie aplikacji COM + - Panel sterowania -> Narzędzia administracyjne -> Usługi Component.


Wystąpił błąd podczas próby utworzenia aplikacji COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
— KZee

8

Nie zmieniłem żadnych ustawień kompilacji.

Wystarczy ustawić „Włącz 32-bitową aplikację = prawda” w Ustawieniach zaawansowanych AppPool.

To zadziałało dla mnie


1
Gdzie są ustawienia zaawansowane AppPool?
— CodyBugstein

7

Rozwiązaniem dla systemu Windows 2008 Server x64 jest:

  1. otwórz cmd.exe z uprawnieniami administratora.
  2. Skopiuj dll do folderu C: \ Windows \ SysWOW64
  3. uruchom regsvr32 z C: \ Windows \ SysWOW64
  4. Sprawdź, czy dll znajduje się w rejestrze systemu Windows.
  5. Jeśli masz plik .exe x86, który korzysta z biblioteki dll, plik exe musi zostać skompilowany w trybie x86.
  6. Plik exe musi być zainstalowany w folderze C: \ Program Files (x86)

Ta procedura jest prawidłowa, jest w porządku.


6

Miałem ten sam problem, ale pozostałe odpowiedzi zawierały tylko jedną część rozwiązania.

Rozwiązanie jest dwojakie:

Usuń 64-bitowy z rejestru.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Nie spowoduje to usunięcia odniesień do innych skopiowanych plików dll w innych folderach.

lub

  • Znajdź klucz o nazwie HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Ten klucz będzie miał domyślną nazwę pliku DLL.
  • Usunąłem folder HKEY_CLASSES_ROOT \ CLSID {......}.

Zarejestruj go jako 32-bitowy:

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

Zarejestrowanie go jako 32-bitowego bez usunięcia rejestracji 64-bitowej nie rozwiązuje mojego problemu.


Bingo! Oto odpowiedź, której szukałem (zobacz moje komentarze w innym miejscu). Dzięki!
— Fandango68,

5

Wystąpił podobny problem z inną, ale podobną poprawką:

Miałem projekt usługi Windows ustawiony na „Any-CPU” przy użyciu 64-bitowej biblioteki DLL. Ten sam komunikat o błędzie. Próbowałem wielu rzeczy, ale nic nie działało. Wreszcie przeszedłem do Właściwości projektu -> Kompiluj i zauważyłem, że w projekcie zaznaczono opcję „Preferuj 32-bit”. Odznaczono to i nie ma już błędu.

Domyślam się, że usługa systemu Windows spodziewała się 32-bitowej biblioteki DLL i nie mogła jej znaleźć.


To dziwne, ale działa !! Dziękuję
— FindOutIslamNow,

3

Aby zmienić na x86:

  1. Utwórz projekt instalacji dla swojego rozwiązania.
  2. Po utworzeniu przejdź do Eksploratora rozwiązań, kliknij prawym przyciskiem myszy projekt instalacyjny.
    • Naciśnij Configuration Manager.
    • Kliknij: ComboBox „Active Solution Platform” i wybierz Nowy (jeśli nie wyświetla się x86)
    • Wybierz z pierwszej kombinacji x86, a następnie naciśnij przycisk OK.
    • przebuduj projekt instalacyjny, a następnie przebuduj cały projekt.

3

Jeśli prowadzisz witrynę internetową, możesz także spróbować ustawić swoją pulę aplikacji tak, aby wyłączała aplikacje 32-bitowe (w zaawansowanych ustawieniach puli).


2
Miałem odwrotnie i musiałem włączyć 32-bitowe aplikacje.
— wiersz 1

2

W moim osobistym przypadku problem został rozwiązany podczas wyszukiwania identyfikatora klasy w rejestrze systemu Windows na komputerze programisty (ponieważ problem został zgłoszony na komputerze klienckim). Ta akcja zostanie umieszczona w komponencie COM, który powoduje problem: biblioteka x86, do której odwołuje się mój projekt .NET, która nie została zarejestrowana jako OCX / COM dla aplikacji instalatora lub aktualizacji.

pozdrowienia


1

Dla każdego, kto używa VSTO, problemem było dla mnie brakujące odniesienie do officezestawu. Pojawiłby się również, gdybyś próbował ręcznie utworzyć instancję niektórych obiektów VSTO.


1

Odkryłem, że mój problem dotyczył faktycznej rejestracji biblioteki DLL.

Najpierw uruchom „Regedit.exe” z wiersza poleceń CMD (podniosłem poziom zabezpieczeń do Administratora, „na wszelki wypadek”), a następnie przeszukaj Rejestr (klikając „Edytuj / Znajdź” w menu RegEdit lub naciskając Ctrl + F) dla CLSID pokazanego w otrzymanym komunikacie o błędzie dotyczącym fabryki klasy COM. Mój CLSID to 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Po znalezieniu tego klucza wybierz podklucz „InProcServer2” w tym węźle Hive i sprawdź nazwę pliku problemowego pliku DLL w prawej ramce Regedit. wyświetlana w obszarze „Domyślne”. Jeśli plik ten znajduje się w pliku „C: \ Windows \ SysWow64” (takim jak C: \ Windows \ SysWow64 \ Redemption.dll ”), ważne jest, aby użyć pliku„ C: \ Windows \ SysWow64 \ RegSvr32.exe ”, aby zarejestruj tę bibliotekę DLL z wiersza polecenia, a NIE domyślną „C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll naciśnij enter. Zamknij okno poleceń (przez „Wyjdź”, a następnie Uruchom ponownie komputer (zawsze używaj restartu zamiast Zamknij w dół, a następnie uruchom, ponieważ (dziwnie) Uruchom ponownie wykonaj dokładne zamknięcie i przeładuj wszystko, podczas gdy „Zamknij” i Power-Up przeładowuje przechowywana pamięć podręczna sterowników i inne wartości (które mogą być wadliwe). Przy każdej rejestracji DLL w przyszłości pamiętaj, aby użyć SysWow64 „RegSvr32.exe” dla dowolnej biblioteki DLL przechowywanej w folderze C: \ Windows \ SysWow64 i ten problem c (jeśli jest to spowodowane nieprawidłową rejestracją) nie powinno się powtórzyć.


Świetna wskazówka, ale pamiętaj, że rejestrując 32-bitową bibliotekę DLL w SysWow64, zakłada się, że biblioteka DLL ma opakowanie do obsługi 64-bitowych żądań.
— Fandango68,

0

Mój problem polegał na tym, że miałem niewłaściwą wersję MS Sync FrameWork (1.0) w moich referencjach do projektu. Po aktualizacji do wersji 2.1 błąd zniknął i życie znów jest dobre.


0

W moim przypadku produkuję plik pakietu MS jak wordlub exceluruchamiam Win+Ri wykonuję dcomcnfgw konfiguracji DCOM, poza tym wybieram element związany z OFFICE (taki jak nazwa zawiera Excellub Wordlub Office) i Open the properties, select Identity tab and select the interactive user.jako odpowiedź ,

Mój komunikat o błędzie pokazuje CLSID {000209FF-0000-0000-C000-000000000046}, więc muszę spróbować znaleźć ten konkretny CLSID w DCOM Config, i wychodzi, wybieram go i wykonuję ten sam krok, ustawiając interactive user, a potem działa.

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.