Abrufen der COM-Klasse ab Werk für die Komponente mit CLSID {XXXX} konnte aufgrund des folgenden Fehler: 80040154

StackOverflow https://stackoverflow.com/questions/1036856

Frage

Ich entwickeln einen Windows-Dienst mit C # .NET PDF-Bericht zu generieren. So generiert PDF-Datei mich einen Dritten DLL verwenden. Die Anwendung wird in meiner Windows XP-Plattform ausgeführt wird. Wenn ich den Dienst in Windows Server bereitgestellt 2008 64-Bit-Version, habe ich diesen Fehler:

  

Abrufen der COM-Klasse ab Werk für   Komponente mit CLSID   {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}   aufgrund der folgenden Fehler fehlgeschlagen:   80040154.

ich registriert die DLL den Befehl regsvr32 verwenden. Ich kann diese CLSID in der Registrierung zu sehen. Aber das Problem weiterhin besteht.

Was könnte das Problem sein?

War es hilfreich?

Lösung

In VS - Projekteigenschaften - in der Registerkarte Build - Plattform target = X86

Andere Tipps

Es klingt wie Ihr Service gegen ‚Any CPU‘ gebaut wurde, Sie Fehler auf 64-Bit verursacht, wo Sie COM-Komponenten verwenden. Sie müssen es für x86 bauen.

Die Website läuft wahrscheinlich als 32-Bit-Prozess, weshalb sie die Komponente nutzen können. Bauen Sie Ihre Lösung gegen x86 zwingt Ihren Dienst als 32-Bit ausgeführt werden.

Ich lief in ein sehr ähnliches Problem.

Ich brauchte einen alten 32-Bit-DLL in einer Web-Anwendung zu verwenden, die auf einer 64-Bit-Maschine entwickelt wurden. Ich registrierte die 32-Bit-DLL in das Windows \ sysWOW64 Ordnern mit der Version von regsrv32 in diesem Ordner verwenden.

Anrufe an den Dritten DLL von Unit-Tests in Visual Studio gearbeitet, aber von der Web-Anwendung konnte nicht in IIS auf der gleichen Maschine mit der 80040154 Fehler gehostet wird.

Ändern des Anwendungspool "Enable 32-Bit-Anwendungen" das Problem behoben.

Sie müssen nicht Ihre Projekteigenschaften Plattform Ziel X86 konfigurieren. Sie können auch die iis Optionen konfigurieren mit x86, so arbeiten

  • Wählen Sie Anwendungspool
  • Wählen Sie den Pool, die Ihre Anwendung verwendet
  • Erweiterte Einstellungen
  • Aktivieren 32-Bit-Anwendungen true

Wenn Sie einen Weg suchen, diese Arbeit zu machen, ohne Ihre Jede CPU Anwendung neu kompilieren, hier ist eine weitere mögliche Abhilfe:

  1. Suchen Sie Ihre COM-Objekt-GUID unter dem HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \ {GUID}
  2. Sobald fügen Sie eine neue REG_SZ (String) Wert liegt. Name sollte AppID sein und Daten sollten die gleiche COM-Objekt GUID, Sie haben gerade gesucht
  3. Fügen Sie einen neuen Schlüssel unter HKEY_CLASSES_ROOT \ Wow6432Node \ AppID. Der neue Schlüssel sollte das gleiche wie das COM-Objekt GUID genannt werden.
  4. Nach dem neuen Schlüssel, den Sie gerade hinzugefügt haben, fügen Sie eine neue Zeichenfolge, und nennen es DllSurrogate. Lassen Sie den Wert leer.
  5. Erstellen Sie einen neuen Schlüssel unter HKEY_LOCAL_MACHINE \ Software \ Classes \ AppID \ Auch hier der neue Schlüssel sollte das gleiche wie das COM-Objekt GUID aufgerufen werden. Keine Werte sind erforderlich unter diesem Schlüssel hinzugefügt werden.

Ich übernehme keine Gutschrift für die Lösung, aber es funktioniert für uns. Überprüfen Sie den Quell-Link für weitere Informationen und andere Kommentare.

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

Das Problem besteht darin, dass der Server-Prozess 64-Bit ist und die Bibliothek 32-Bit und er versucht, die COM-Komponente in demselben Prozess (in-proc-Server) zu erstellen. Entweder Sie neu kompilieren Sie den Server und machen es 32-Bit oder verlassen Sie den Server unverändert und machen die COM-Komponente out-of-process. Der einfachste Weg, einen COM-Server out-of-Prozess zu machen, ist eine COM + -Anwendung erstellen - Systemsteuerung -> Verwaltung -.> ComponentServices

Ich habe keine Einstellungen kompilieren ändern.

Just gesetzt "Enable 32-Bit-Anwendung = True" in AppPool Erweiterte Einstellungen.

Es ist für mich gearbeitet

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

  1. open cmd.exe mit Administrator-Zugriffsrechte.
  2. Kopieren Sie die DLL in den Ordner C: \ Windows \ SysWOW64
  3. laufen regsvr32 von C: \ Windows \ SysWOW64
  4. Stellen Sie sicher, dass DLL ist in der Registry von Windows.
  5. Wenn Sie eine Exe-x86 hat, dass die DLL verwenden, muss die exe in x86-Modus kompiliert werden.
  6. Die exe muss im Ordner C installiert werden: \ Program Files (x86)

Dieses Verfahren gilt, ist es ok ist.

Sie hat ein ähnliches Problem mit einer anderen, aber ähnlichen fix:

hatte ich ein Projekt Windows-Dienst auf "Any-CPU" mit einem 64-Bit-DLL. Gleiche Fehlermeldung. Versucht, eine ganze Reihe von Dingen, aber nichts funktionierte. Schließlich ging ich in den Projekteigenschaften -> Build und bemerkte, dass Projekt „Bevorzugen 32-Bit“ hatte geprüft. Nicht markiert diese und nicht mehr Fehler.

Meine Vermutung ist, dass der Windows-Dienst war ein 32-Bit-DLL erwartet, und konnte es nicht finden.

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

Die Lösung ist zweifach:

Nehmen Sie die 64-Bit aus dem Registery.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Dies wird nicht Verweise auf andere der DLL in anderen Ordnern kopiert entfernen.

oder

  • Suchen Sie den Schlüssel namens HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Dieser Schlüssel wird der Dateiname der DLL als den Standardwert haben.
  • Ich entfernte die HKEY_CLASSES_ROOT \ CLSID {......} Ordner.

Registrieren Sie als 32-Bit:

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

als 32-Bit-Registrierung, ohne die 64-Bit-Registrierung entfernen nicht mein Problem beheben.

Um zu x86 zu ändern:

  1. Erstellen Sie ein Setup-Projekt für Ihre Lösung.
  2. Wenn Sie es schaffen, zur Lösung Explorer mit der rechten das Setup-Projekt klicken.
    • Drücken Sie Configuration Manager.
    • Klicken Sie auf: "Aktive Solution Platform" Combobox und wählen Sie Neu (Wenn kein x86 ist angezeigt)
    • Wählen Sie aus dem ersten Combo x86 und drücken Sie OK.
    • Wiederaufbau Setup-Projekt, dann wieder aufbauen All das Projekt.

Wenn Sie eine Website ausgeführt werden, können Sie auch versuchen, Ihren Anwendungspool festlegen 32-Bit-Anwendungen deaktivieren (unter erweiterten Einstellungen eines Pool).

Für jedermann mit VSTO, das Problem war für mich ein fehlenden Hinweis auf die office Montag. Es wäre auch angezeigt, wenn Sie manuell bestimmte VSTO Objekte zu instanziiert versuchen.

In meinem persönlichen Fall das Problem behoben wurde in der Windows-Registry auf dem Entwickler-Maschine für die Klasse ID suchen (weil das Thema wurde in einem Client-PC geworfen). Diese Aktion wird in die COM-Komponente platziert wird, das das Problem verursacht. eine x86-Bibliothek in meinem .NET-Projekt verwiesen, die nicht als OCX / COM registriert wurde für den Installateur oder Aktualisierungsprogramm

Viele Grüße

Mein Problem war, dass ich die falsche MS Sync Framework-Version (1.0) in meinem Projekt Referenzen hatte. Nach dem Update auf die Version 2.1 wurde der Fehler weg und das Leben ist wieder gut.

Ich fand, dass mein Problem auf die tatsächliche Registrierung des DLL verwendet.

First run „Regedit.exe“ aus einer CMD-Eingabeaufforderung (Ich hob es Sicherheitsstufe auf Administrator, „just in case“), dann die Registry suchen (durch Klicken auf „Bearbeiten / Suchen“ im RegEdit Menü oder durch Drücken von Strg + F) für die CLSID in der Fehlermeldung zeigt, die Sie in Bezug auf die COM-Klasse Fabrik erhalten. Mein CLSID war 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Wenn dieser Schlüssel gefunden, wählen Sie den Unterschlüssel „InProcServer2“ unter diesem Hive Knoten und den Dateinamen des Problems DLL in der rechten Regedit Rahmen festzustellen. unter „Default“ zeigt. Wenn diese Datei befindet sich in "C: \ Windows \ SysWow64" (wie zB C: \ Windows \ SysWow64 \ Redemption.dll ") dann ist es wichtig, dass Sie die „C: \ Windows \ SysWow64 \ RegSvr32.exe“ Datei, die DLL von der Kommandozeile und nicht den Standard „C: \ Windows \ System32 \ RegSvr32.exe“, um die Registerdatei. Also lief ich eine CMD-Eingabeaufforderung (unter Verwaltungsebene Kontrolle (nur für den Fall dieser Ebene erforderlich ist, muß) und Typ auf der Kommandozeile (im Fall meiner DLL): C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll die Presse ein. Schließen Sie das Befehlsfenster (über „Exit“, dann Neu starten Ihr Computer (immer Neustart statt schließen dann nach oben beginnen, da (seltsam) durchführen Starten Sie eine gründliche heruntergefahren und neu geladen werden alles während „Shut Down "und Power-Up neu lädt eine gespeicherte Cache-Treiber und andere Werte (die fehlerhaft sein können). Jedes Mal, wenn Sie eine DLL in Zukunft registrieren, erinnere dich an die SysWow64 „RegSvr32.exe“ für jede DLL in C gespeichert zu verwenden: \ Windows \ SysWow64 Ordner und dieses Problem c (wenn es durch eine falsche Registrierung verursacht wird) sollen nicht noch einmal passieren.

In meinem Fall, ich produzieren ms Office-Datei wie word oder excel, betreibe ich Win+R und führen dcomcnfg, in der DCOM-Konfiguration neben wählen OFFICE bezogenen Namen Punkt (wie Name enthält Excel oder Word oder Office) und Open the properties, select Identity tab and select the interactive user. wie diese Antwort ,

Meine Fehlermeldung anzeigen CLSID {000209FF-0000-0000-C000-000000000046}, so muß ich versuchen, diese spezifische CLSID in DCOM-Konfiguration zu finden, und es tut exsits, und ich wähle Sie es und demselben Schritt folge den interactive user gesetzt ist, dann funktioniert es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top