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?

gopal
źródło
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

Fabrice MARIANADIN
źródło
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.

Daniel Ballinger
źródło
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.

stevehipwell
źródło
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
nazim hatipoglu
źródło
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/

Joshua Starner
źródło
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.

sharptooth
źródło
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

Eduardo Xavier
źródło
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.

Juan
źródło
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.

Gerhard Powell
źródło
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źć.

jinushaun
źródło
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.
ShouShouLeb
źródło
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).

scramblor
źródło
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

César Qüeb
źródło
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.

Alex
źródło
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ć.

Chris Raisin
źródło
Ś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.

Phogrammer
źródło
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.

yu yang Jian
źródło