Das Abrufen der COM-Klassenfactory für Komponenten mit CLSID {XXXX} ist aufgrund des folgenden Fehlers fehlgeschlagen: 80040154

278

Ich habe einen Windows-Dienst mit C # .NET entwickelt, um einen PDF-Bericht zu erstellen. Zum Generieren einer PDF-Datei verwende ich eine DLL eines Drittanbieters. Die Anwendung wird auf meiner Windows XP-Plattform ausgeführt. Bei der Bereitstellung des Dienstes in der 64-Bit-Version von Windows Server 2008 wurde folgende Fehlermeldung angezeigt:

Das Abrufen der COM-Klassenfactory für Komponenten mit der CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} ist aufgrund des folgenden Fehlers fehlgeschlagen: 80040154.

Ich habe die DLL mit dem Befehl regsvr32 registriert. Ich kann diese CLSID in der Registrierung sehen. Das Problem besteht jedoch weiterhin.

Was könnte das Problem sein?

gopal
quelle
1
Eine auf demselben Server gehostete Webanwendung kann fehlerfrei PDF-Dateien generieren.
Gopal
Leute, ich habe jede mögliche Lösung ausprobiert, aber immer noch diesen Fehler bekommen. Ich habe Assemblys und habe sie erfolgreich registriert, erhalte aber immer noch den gleichen Fehler.
Brauche

Antworten:

383

In VS - Projekteigenschaften - auf der Registerkarte Erstellen - Plattformziel = X86

Fabrice MARIANADIN
quelle
7
In VS2008 fand ich diese Option unter 'Kompilieren-> Erweiterte Kompilierungsoptionen ...' (am unteren Rand der Fensterregisterkarte) und dann unter 'Ziel-CPU' (x86)
Rodolfo
1
Sie verdienen mehr als eine +1, aber +1 ist alles, was ich geben muss
David
7
Dies ist nicht immer die Lösung.
2
Sie haben mir sieben Offshore-Bankkonten, einen Hot-Dog-Stand und meine Ehe gerettet. Vielen Dank
Donald.Record
2
Ich habe die gleiche Fehlermeldung, aber diese Lösung funktioniert bei mir nicht.
Akram Khan
59

Ich bin auf ein sehr ähnliches Problem gestoßen.

Ich musste eine alte 32-Bit-DLL in einer Webanwendung verwenden, die auf einem 64-Bit-Computer entwickelt wurde. Ich habe die 32-Bit-DLL mit der Version von regsrv32 in diesem Ordner im Ordner windows \ sysWOW64 registriert.

Aufrufe der DLL eines Drittanbieters wurden anhand von Komponententests in Visual Studio ausgeführt, schlugen jedoch in der Webanwendung fehl, die in IIS auf demselben Computer mit dem Fehler 80040154 gehostet wurde.

Durch Ändern des Anwendungspools in "32-Bit-Anwendungen aktivieren" wurde das Problem behoben.

Daniel Ballinger
quelle
1
Dies ist der einfachste Weg, um dieses Problem zu beheben. Vielen Dank!
Dexter
6
Ich liebe diese Antwort wirklich. Es macht keinen Sinn, eine ganze Website für x86 zu kompilieren, wenn Sie irgendwann nur noch eine winzige 32-Bit-DLL aufrufen.
DanM7
@ Daniel Ballinger Würde meine Anwendung bei der Änderung als 32-Bit-Prozess ausgeführt?
Anfänger
@Danny Ich glaube nicht, da es nicht auf die DLL zugreifen kann, die ich bei sysWOW64 registriert habe.
Daniel Ballinger
1
Ich habe das gleiche Problem, aber ich weiß nicht, wie ich den Anwendungspool ändern soll. Wo soll ich das tun? Bitte helfen Sie mir
Shima.Y
58

Es hört sich so an, als ob Ihr Dienst gegen "Beliebige CPU" erstellt wurde, was zu Fehlern bei 64-Bit führt, wenn Sie COM-Komponenten verwenden. Sie müssen es für bauen x86.

Die Website wird wahrscheinlich als 32-Bit-Prozess ausgeführt, weshalb sie die Komponente verwenden kann. Wenn Sie Ihre Lösung gegen x86erstellen, wird Ihr Dienst als 32-Bit ausgeführt.

stevehipwell
quelle
Ich habe auch das gleiche Problem. Hier ist meine Desktop-Anwendung erfolgreich auf einem 64-Bit-System installiert. Während der Installation habe ich die Synchronisierung erfolgreich durchgeführt. Wenn ich jedoch eine Synchronisierung mit meiner Software durchführe, wird der obige Fehler
angezeigt
Ich versuche mich zu registrieren .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx), erhalte aber einen Fehler. Das Modul konnte nicht geladen werden. Stellen Sie sicher, dass die Binärdatei im angegebenen Pfad gespeichert ist, oder debuggen Sie sie, um nach Problemen mit der Binärdatei oder abhängigen DLL-Dateien zu suchen.
Naveen Kumar
Und wenn es als 32-Bit kompiliert ist, sollte das System regsvr32 verwendet werden, nicht die SysWow64-Version.
Fandango68
Ich erhalte diesen Fehler beim Ausführen des SSIS-Pakets. Die Verbindungen funktionieren einwandfrei. Alle Eigenschaften sind korrekt. Eigentlich lief das SSIS-Paket seit vielen Monaten fehlerfrei. Plötzlich komme ich über den Fehler. Ich habe versucht, die Laufzeit / das Debuggen von x64 auf x86 zu ändern. Das Problem wurde immer noch nicht behoben.
IamVISH
16

Sie müssen Ihr Plattformziel für Projekteigenschaften X86 nicht konfigurieren. Sie können die iis-Optionen auch so konfigurieren, dass sie mit x86 funktionieren

  • Wählen Sie Anwendungspool
  • Wählen Sie den Pool aus, den Ihre App verwendet
  • Erweiterte Einstellungen
  • Aktivieren Sie 32-Bit-Anwendungen true
Nazim Hatipoglu
quelle
Das war schon immer so für mich. Das Plattformziel musste nie auf X86 festgelegt werden, sondern immer • 32-Bit-Anwendungen
aktivieren
Ich hatte ein ähnliches Problem, das gemäß den Anweisungen von Nazim behoben wurde, musste aber auch nicht "Interop-Typen einbetten" (eine Eigenschaft der referenzierten DLL) und Copy Local = true setzen.
Cymorg
Wie wählt man "Anwendungspool auswählen"?
CodyBugstein
Das Menü "Anwendungspools" befindet sich in der Liste
seines
16

Wenn Sie nach einer Möglichkeit suchen, dies zu erreichen, ohne Ihre Any CPU-Anwendung neu zu kompilieren, ist hier eine weitere mögliche Problemumgehung:

  1. Suchen Sie die GUID Ihres COM-Objekts unter HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}.
  2. Fügen Sie nach dem Auffinden einen neuen REG_SZ-Wert (Zeichenfolge) hinzu. Der Name sollte AppID sein und die Daten sollten dieselbe COM-Objekt-GUID sein, nach der Sie gerade gesucht haben
  3. Fügen Sie unter HKey_Classes_Root \ Wow6432Node \ AppID einen neuen Schlüssel hinzu. Der neue Schlüssel sollte genauso heißen wie die COM-Objekt-GUID.
  4. Fügen Sie unter dem neuen Schlüssel, den Sie gerade hinzugefügt haben, einen neuen Zeichenfolgenwert hinzu und nennen Sie ihn DllSurrogate. Lassen Sie den Wert leer.
  5. Erstellen Sie einen neuen Schlüssel unter HKey_Local_Machine \ Software \ Classes \ AppID \. Der neue Schlüssel sollte wieder genauso heißen wie die GUID des COM-Objekts. Unter diesem Schlüssel müssen keine Werte hinzugefügt werden.

Ich nehme keine Anerkennung für die Lösung, aber es hat bei uns funktioniert. Überprüfen Sie den Quelllink für weitere Informationen und andere Kommentare.

Quelle: https://techtalk.gfi.com/32bit-object-64bit-environment/

Joshua Starner
quelle
1
Sehr gute Anweisungen. Ich habe ein Tool eines Drittanbieters verwendet, sodass ich die Build-Plattform nicht ändern konnte. Diese Lösung hat dieses Problem umgangen. Danke dir!
Ich habe den Schlüssel gefunden, wie Sie in Schritt 1 beschrieben haben, und dann wusste ich, welches COM-Objekt die Probleme verursacht, dann führe ich einfach regsvr32 darauf aus. Vielen Dank!
MichaelS
Als ich dies tat, wurde meinem lokalen Webserver (IIS) der Zugriff verweigert. Dies sagt mir, dass dies ein Schritt in die richtige Richtung war, aber ich bin mir nicht sicher, wem ich zu diesem Zeitpunkt Zugriff gewähren soll. stackoverflow.com/questions/14019401/…
user420667
14

Das Problem ist, dass der Serverprozess 64-Bit und die Bibliothek 32-Bit ist und versucht, die COM-Komponente im selben Prozess (In-Proc-Server) zu erstellen. Entweder kompilieren Sie den Server neu und machen ihn 32-Bit, oder Sie lassen den Server unverändert und machen die COM-Komponente außer Betrieb. Der einfachste Weg, einen COM-Server außer Betrieb zu setzen, besteht darin, eine COM + -Anwendung zu erstellen - Systemsteuerung -> Verwaltung -> ComponentServices.

scharfer Zahn
quelle
Beim Versuch, eine COM + -Anwendung zu erstellen, ist ein Fehler aufgetreten. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee
8

Ich habe keine Kompilierungseinstellungen geändert.

Setzen Sie einfach "32-Bit-Anwendung aktivieren = True" in den erweiterten AppPool-Einstellungen.

Es hat bei mir funktioniert

Eduardo Xavier
quelle
1
Wo befinden sich die erweiterten AppPool-Einstellungen?
CodyBugstein
7

Die Lösung für Windows 2008 Server x64 lautet:

  1. Öffnen Sie cmd.exe mit Administratorberechtigung.
  2. Kopieren Sie die DLL in den Ordner C: \ Windows \ SysWOW64
  3. Führen Sie regsvr32 unter C: \ Windows \ SysWOW64 aus
  4. Stellen Sie sicher, dass sich die DLL in der Registrierung von Windows befindet.
  5. Wenn Sie eine EXE-x86-Datei haben, die die DLL verwendet, muss die Exe im x86-Modus kompiliert werden.
  6. Die exe muss im Ordner C: \ Programme (x86) installiert sein.

Dieses Verfahren ist gültig, es ist in Ordnung.

Juan
quelle
6

Ich hatte das gleiche Problem, aber die anderen Antworten lieferten nur einen Teil der Lösung.

Die Lösung ist zweifach:

Entfernen Sie das 64-Bit aus dem Register.

  • c: \ windows \ system32 \ regsvr32.exe / U.
  • Dadurch werden keine Verweise auf andere Kopien der DLL in anderen Ordnern entfernt.

oder

  • Suchen Sie den Schlüssel HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Dieser Schlüssel hat den Dateinamen der DLL als Standardwert.
  • Ich habe den Ordner HKEY_CLASSES_ROOT \ CLSID {......} entfernt.

Registrieren Sie es als 32bit:

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

Das Registrieren als 32-Bit-Registrierung ohne Entfernen der 64-Bit-Registrierung behebt mein Problem nicht.

Gerhard Powell
quelle
Bingo! Das ist die Antwort, nach der ich gesucht habe (siehe meine Kommentare an anderer Stelle). Vielen Dank!
Fandango68
5

Hatte ein verwandtes Problem mit einem anderen, aber ähnlichen Fix:

Ich hatte ein Windows-Dienstprojekt mit einer 64-Bit-DLL auf "Any-CPU" eingestellt. Gleiche Fehlermeldung. Versuchte eine ganze Reihe von Dingen, aber nichts funktionierte. Schließlich ging ich zu Projekteigenschaften -> Erstellen und stellte fest, dass für das Projekt "32-Bit bevorzugen" aktiviert war. Deaktiviert dies und kein Fehler mehr.

Ich vermute, dass der Windows-Dienst eine 32-Bit-DLL erwartet hat und diese nicht finden konnte.

jinushaun
quelle
Das ist zwar seltsam, aber es funktioniert !! Vielen Dank
FindOutIslamNow
3

So wechseln Sie zu x86:

  1. Erstellen Sie ein Setup-Projekt für Ihre Lösung.
  2. Gehen Sie nach dem Erstellen zum Projektmappen-Explorer und klicken Sie mit der rechten Maustaste auf das Setup-Projekt.
    • Drücken Sie Configuration Manager.
    • Klicken Sie auf das Kombinationsfeld "Active Solution Platform" und wählen Sie "Neu" (wenn kein x86 angezeigt wird).
    • Wählen Sie aus der ersten Combo x86 und drücken Sie OK.
    • Erstellen Sie das Setup-Projekt neu und erstellen Sie dann das gesamte Projekt neu.
ShouShouLeb
quelle
3

Wenn Sie eine Website betreiben, können Sie auch versuchen, Ihren Anwendungspool so einzustellen, dass 32-Bit-Anwendungen deaktiviert werden (unter den erweiterten Einstellungen eines Pools).

Scramblor
quelle
2
Ich hatte das Gegenteil und musste 32-Bit-Anwendungen aktivieren.
Reihe1
2

In meinem persönlichen Fall wurde das Problem bei der Suche nach der Klassen-ID in der Windows-Registrierung auf dem Entwicklercomputer behoben (da das Problem auf einem Client-PC ausgelöst wurde). Diese Aktion wird in die COM-Komponente eingefügt , die das Problem verursacht: eine x86-Bibliothek, auf die in meinem .NET-Projekt verwiesen wird und die nicht als OCX / COM für das Installationsprogramm oder die Updater-Anwendung registriert wurde.

Grüße

César Qüeb
quelle
1

Für jeden, der VSTO verwendet, war das Problem für mich ein fehlender Verweis auf die officeBaugruppe. Es wird auch angezeigt, wenn Sie versuchen, bestimmte VSTO-Objekte manuell zu instanziieren.

Alex
quelle
1

Ich stellte fest, dass mein Problem mit der tatsächlichen Registrierung der DLL zusammenhängt.

Führen Sie zuerst "Regedit.exe" an einer CMD-Eingabeaufforderung aus (ich habe die Sicherheitsstufe auf "Administrator" erhöht, "nur für den Fall") und durchsuchen Sie dann die Registrierung (indem Sie im RegEdit-Menü auf "Bearbeiten / Suchen" klicken oder Strg + F drücken). für die CLSID, die in der Fehlermeldung angezeigt wird, die Sie bezüglich der COM-Klassenfactory erhalten haben. Meine CLSID war 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Wenn dieser Schlüssel gefunden wurde, wählen Sie den Unterschlüssel "InProcServer2" unter diesem Hive-Knoten aus und ermitteln Sie den Dateinamen der Problem-DLL im rechten Regedit-Frame. wird unter "Standard" angezeigt. Wenn sich diese Datei in "C: \ Windows \ SysWow64" befindet (z. B. C: \ Windows \ SysWow64 \ Redemption.dll "), ist es wichtig, dass Sie die Datei" C: \ Windows \ SysWow64 \ RegSvr32.exe "verwenden Registrieren Sie diese DLL über die Befehlszeile und NICHT die Standardeinstellung "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll Drücken Sie die Eingabetaste. Schließen Sie das Befehlsfenster (über „Exit“ dann neu starten Sie den Computer (immer Neustart statt schließen dann starten, da (seltsam) Restart eine gründliche heruntergefahren und neu geladen werden alles ausführen , während „Shut Down“ und Power-Up ein nachlädt Gespeicherter Cache mit Treibern und anderen Werten (die möglicherweise fehlerhaft sind). Wenn Sie in Zukunft eine DLL registrieren, denken Sie daran, die SysWow64 "RegSvr32.exe" für alle im Ordner C: \ Windows \ SysWow64 gespeicherten DLLs und dieses Problem zu verwenden. c (wenn es durch falsche Registrierung verursacht wird) sollte nicht wieder vorkommen.

Chris Raisin
quelle
Toller Tipp, aber beachten Sie, dass beim Registrieren einer 32-Bit-DLL in SysWow64 davon ausgegangen wird, dass die DLL über einen Wrapper für 64-Bit-Anforderungen verfügt.
Fandango68
0

Mein Problem war, dass ich in meinen Projektreferenzen die falsche MS Sync FrameWork-Version (1.0) hatte. Nach dem Update auf Version 2.1 war der Fehler behoben und das Leben ist wieder gut.

Phogrammer
quelle
0

In meinem Fall, ich MS Office - Datei wie Herstellung wordoder excel, ich laufe Win+Rund ausführen dcomcnfg, in der DCOM - Konfiguration neben wählt OFFICE bezogenen Namen Punkt (wie Name enthält Exceloder Wordoder Office) und Open the properties, select Identity tab and select the interactive user.wie diese Antwort ,

Meine Fehlermeldung wird CLSID {000209FF-0000-0000-C000-000000000046}angezeigt, daher muss ich versuchen, diese bestimmte CLSID in DCOM Config zu finden, und sie wird beendet. Ich wähle sie aus und folge demselben Schritt, setze die interactive user, dann funktioniert sie.

Yu Yang Jian
quelle