Wie löse ich die nicht registrierte COM-Ausnahmeklasse (Ausnahme von HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?

90

Wenn ich versuche, eine Instanz einer COM-Klasse zu erstellen, wird eine Ausnahme als ausgelöst

Klasse nicht registriert (Ausnahme von HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Bitte schlagen Sie vor, wie ich es lösen könnte.

Jaswant Agarwal
quelle
1
Können Sie mit etwas Code mehr Details geben?
Xaisoft
10
Es gibt zwei Fragen: 1. Haben Sie die COM-Komponente auf dem Windows 7 x64-Computer installiert / registriert? 2.Was ist die Zielplattform Ihrer Anwendung? Ich denke, Sie sollten die Plattform auf x86 einstellen. Stellen Sie sie bitte nicht als "Beliebige CPU" ein. Bitte registrieren Sie zuerst die COM und führen Sie sie dann aus, um die Anwendung zu testen. Weitere Informationen finden Sie im Dokument: support.microsoft.com/kb/146219 und Erläuterungen zur Verwendung und zu Fehlermeldungen von Regsvr32
JackWang
Ich habe es gelöst, ohne das Build-Ziel auf 'x86' zu ändern. Lösung im Link: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Antworten:

47

Es sieht so aus, als ob das Programm oder der Prozess, den Sie initialisieren möchten, entweder nicht auf Ihrem Computer installiert ist, eine beschädigte Installation aufweist oder registriert werden muss.

Entweder installieren, reparieren (über Software) oder registrieren (über Regsvr32.exe).

Sie haben uns nicht genügend Informationen zur Verfügung gestellt, um Ihnen weiter zu helfen.

Jay Riggs
quelle
4
Denken Sie, Sie meinten RegSvr32.exe (im Gegensatz zu RegSrv32.exe).
WindowsGM
60

Sie müssen sicherstellen, dass alle Ihre Assemblys für die richtige Architektur kompiliert werden. Versuchen Sie, die Architektur für x86 zu ändern, wenn die Neuinstallation der COM-Komponente nicht funktioniert.

Andy Fiedler
quelle
Dies löste meinen Prozess, bei dem der NAV 2009 R2-Client nicht gefunden wurde (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Vincent Vancalbergh
14

Mein Problem und die Lösung

Ich habe eine 32-Bit-DLL eines Drittanbieters, die ich auf einer 2008 R2-Maschine installiert habe, die 64-Bit ist.

Ich habe einen wcf-Dienst im .net 4.5-Framework erstellt, der die 32-Bit-Drittanbieter-DLL für den Prozess aufruft. Jetzt habe ich eine Eigenschaft erstellt, die auf "jede" CPU abzielt, und sie auf dem 64-Bit-Computer bereitgestellt.

Als ich versuchte, den wcf-Dienst aufzurufen, wurde der Fehler "80040154 Klasse nicht registriert (Ausnahme von HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG") angezeigt.

Jetzt habe ich ProcMon.exe verwendet, um das com-Registrierungsproblem zu verfolgen, und festgestellt, dass der Prozess nach dem Registrierungseintrag unter HKLM \ CLSID und HKCR \ CLSID sucht, wo es keinen Eintrag gibt.

Es wurde festgestellt, dass Microsoft die 32-Bit-COM-Komponenten nicht in den Pfaden HKLM \ CLSID, HKCR \ CLSID auf einem 64-Bit-Computer registriert, sondern den Eintrag in den Pfaden HKLM \ Wow6432Node \ CLSID und HKCR \ Wow6432Node \ CLSID platziert.

Jetzt ist der Konflikt ein 64-Bit-Prozess, der versucht, einen 32-Bit-Prozess auf einem 64-Bit-Computer aufzurufen, der nach dem Registrierungseintrag in HKLM \ CLSID, HKCR \ CLSID sucht. Die Lösung besteht darin, den 64-Bit-Prozess zu zwingen, den Registrierungseintrag unter HKLM \ Wow6432Node \ CLSID und HKCR \ Wow6432Node \ CLSID zu überprüfen.

Dies kann erreicht werden, indem die Eigenschaften des wcf-Serviceprojekts so konfiguriert werden, dass sie auf 'X86'-Computer anstatt auf' Beliebig 'abzielen.

Nach der Bereitstellung der 'X86'-Version auf dem 2008 R2-Server wurde das Problem "System.BadImageFormatException: Datei oder Assembly konnte nicht geladen werden" angezeigt.

Die Lösung für diese badimageformatexception besteht darin, die 'Enable32bitApplications' in den IIS Apppool-Eigenschaften für den richtigen Apppool auf 'True' zu setzen.

Waheed
quelle
Bitte posten Sie keine identischen Antworten auf mehrere Fragen. Schreiben Sie eine gute Antwort und stimmen Sie ab, um die anderen Fragen als Duplikate zu schließen. Wenn die Frage kein Duplikat ist, passen Sie Ihre Antworten auf die Frage an .
Kleopatra
10

Beachten Sie auch, dass der Klassenkontext beim Initialisieren diese Ausnahme erstellen kann. Wenn Sie ein Objekt haben, das als INPROC_SERVER codiert ist, aber versuchen, CoCreateInstance als CLSCTX_LOCAL_SERVER zu verwenden, wird dieser Fehler ebenfalls angezeigt.

Sie müssen sicherstellen, dass das Objekt registriert ist und CoCreateInstance eine Instanz mit dem richtigen Klassenkontext erstellt.

Andrew Keith
quelle
Ja, wenn Sie zum Beispiel versuchen, DesktopWallpapermit CLSCTX_INPROC(anstelle von CLSCTX_ALL) zu erstellen , erhalten Sie den 0x80040154 (REGDB_E_CLASSNOTREG)Fehler.
user362515
9

Wenn Sie 64-Bit-COM-Komponenten in einer Webanwendung unter IIS verwenden, stellen Sie sicher, dass im Anwendungspool keine 32-Bit-Anwendungen zulässig sind ( 32-Bit-Anwendungen aktivieren: in erweiterten Einstellungen false ).

Matsen75
quelle
4

Ich habe es zum Laufen gebracht, indem ich 32-Bit-Anwendungen in den erweiterten Einstellungen des Anwendungspools aktiviert habe. Klicken Sie mit der rechten Maustaste auf den Anwendungspool und wählen Sie erweiterte Einstellungen - aktivieren Sie 32-Bit-Anwendungen. Dies kann jemandem da draußen helfen.

Yoky
quelle
Auch für mich. Eine 32-Bit-DLL, die auf einem 64-Bit-Entwicklungscomputer, einem 64-Bit-Test und einem 64-Bit-Live-Server verwendet wird. Funktionierte gut auf der Entwicklungsbox. Bei der Bereitstellung auf den Test- und Live-Servern schlug dies fehl, bis 32-Bit-Apps in den jeweiligen IIS-App-Pools zugelassen und die Pools neu gestartet wurden. Ich musste auch "Interop-Typen einbetten" deaktivieren (eine Einstellung für die fehlerhafte DLL in VS) und "Lokal kopieren" = true setzen, um sicherzustellen, dass die DLL tatsächlich in ihrer ursprünglichen Form auf die Server kopiert wurde.
Cymorg
3

Durch Registrieren der Klasse (insbesondere ihrer CLSID) - siehe zB hier .

Alex Martelli
quelle
Könnte es auch ein Objekt sein, das auf seinem Computer oder Server installiert werden muss, nicht unbedingt eine Registrierung der Klasse.
Xaisoft
@Xaisoft, "Installation" beinhaltet normalerweise "Registrierung", wie die MSDN-URL, auf die ich hingewiesen habe, erwähnt.
Alex Martelli
3

in meinem Fall

my platform ist x64

the Dll library(sdk)und das redistributable packageist x64

so

  1. im Lösungs-Explorer navigate to your project

  2. öffnen Properties

  3. change the Platform target from AnyCPU to x64

Geben Sie hier die Bildbeschreibung ein

Basheer AL-MOMANI
quelle
2

Die Art und Weise, wie ich dieses Problem gelöst habe, war die Registrierung der COMVia regsvr32.

Stellen Sie sicher, dass die von Ihnen aufgerufene COM registriert ist.

Meine Anwendung wurde verwendet xceedcry.dllund ich habe sie nicht registriert. Nachdem ich es registriert hatte, funktionierte die Anwendung einwandfrei.

CesarB
quelle
2

Meine Lösung bestand darin, " 32-Bit-Anwendungen aktivieren " in den erweiterten Einstellungen des relativen App-Pools in IIS in "True " zu ändern .

App-Pool

Aktivieren Sie 32-Bit-Anwendungen

Adrian
quelle
2

In meinem Fall wurde die Klasse ordnungsgemäß registriert und in JEDEM CPU / 64-Bit- Modus erstellt.

Die Eigenschaft 32-Bit-Anwendungen aktivieren des IIS-Anwendungspools der Anwendung, die die Klasse verwendet, wurde jedoch auf True festgelegt .

Die Klasse wurde aufgrund der Nichtübereinstimmung der Architektur zwischen der Anwendungspoolkonfiguration und der tatsächlich registrierten Klasse nicht gefunden.

Durch Festlegen von " 32-Bit-Anwendungen aktivieren" auf " Falsch" wurde das Problem behoben. IIS-App-Pool-Einstellungen

Bhupinderjit Dhanoa
quelle
1

Für mich musste ich eine 64-Bit-Build-Konfiguration erstellen.

jbooker
quelle
1

Ich hatte das gleiche Problem mit MapWinGis. Ich habe die Lösung gefunden, indem ich an Visual Studios 2015 Windows Forms Proyect gearbeitet habe. Klicken Sie einfach mit der rechten Maustaste auf Proyect-> Eigenschaften-> Erstellen, setzen Sie die Konfiguration auf Alle Konfigurationen und setzen Sie sie in der Conbobox "Plattformziel" auf x64.

Deydra A.
quelle
0

Ich bin auf dieses Problem gestoßen, als ich eine .NET-Assembly von einem C ++ - Client über COM aufgerufen habe. Es stellt sich heraus, dass eine der Assemblys, von denen die .Net-Assembly abhängig war, nicht gefunden werden konnte. Ich rang eine Weile und versuchte herauszufinden, was mit der 1. Versammlung nicht stimmte, aber es war tatsächlich eine der Abhängigkeiten der 1. Versammlung. Beim Aufrufen von CoCreateInstance () vom C ++ - Client sind zwei verschiedene Fehler aufgetreten. Der erste war: REGDB_E_CLASSNOTREG Klasse nicht registriert . Der zweite Versuch war: 0x80131040: Die Manifestdefinition der gefundenen Assembly stimmt nicht mit der Assemblyreferenz überein.

Überprüfen Sie daher, ob die Referenzen Ihrer Baugruppe vorhanden sind. Ich entdeckte dies, indem ich die erste Assembly mit dotPeek durchsuchte und bemerkte, dass eine der Referenzen fehlte. Durch Platzieren der richtigen Version der Abhängigkeit in dem Ordner wurden beide Fehler behoben.

Sean B.
quelle
0

Ich habe meine Anwendung für jede CPU kompiliert und das Hauptproblem stellte sich heraus, dass der Adobe Reader älter installiert wurde. 10.x muss v11.x aktualisieren. Auf diese Weise kann ich dieses Problem beheben.

Anjan Kant
quelle
0

Ich bin auf dasselbe Problem mit einer COM-Klasse gestoßen, dh "Klasse nicht registrierte Ausnahme" zur Laufzeit. Für mich war ich in der Lage, eine Lösung zu finden, indem ich in die Datei app.config ging und die Elemente 'startup' und 'SupportedRuntime' in Folgendes änderte:

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

Weitere Informationen finden Sie hier http://stackoverflow.com/questions/1604663/

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

Ich sollte beachten, dass ich Visual Studio 2017 ausführe. Ziel-CPU = x86 Interop-Typ einbetten = true (im Eigenschaftenfenster)

Joseph Mawer
quelle
0

Gehen Sie in das Verzeichnis des .Net-Frameworks und registrieren Sie die entsprechende DLL im Regsvr32.exe- Leerraum-DLL-Pfad.

Muhammad Saeed
quelle
0

Ich habe das gleiche Problem konfrontiert. Nachdem ich einige Nachforschungen angestellt hatte, fand ich eine Lösung für mich und es kann nützlich sein. Das Problem hängt nach meiner Beobachtung nicht nur mit der Neuinstallation zusammen, sondern auch von den Zugriffsberechtigungen.

Schritt 1: Reparieren Sie das jeweilige COM-Objekt.

Schritt 2: Komponentendienste> Computer> Arbeitsplatz> DCOM-Konfiguration> Wählen Sie Ihr COM-Objekt aus> Rechtsklick> Eigenschaften> Registerkarte Sicherheit> Zugriffsberechtigungen> Wählen Sie Anpassen> Klicken Sie auf BEARBEITEN> Wählen Sie IIS_USER (falls nicht vorhanden, erstellen Sie mit vollständigen Rechten) und geben Sie vollständig an Zugriff und klicken Sie auf OK.

Zur Registerkarte Identität wechseln> Sie können "Interaktiver Benutzer" oder "Dieser Benutzer" auswählen> Klicken Sie auf Übernehmen und auf OK. Wenn Sie "Dieser Benutzer" auswählen, müssen wir diesem Server Administratorrechte gewähren

Schritt 3: Öffnen Sie IIS Manager> Starten Sie die Anwendungspools neu.

Hinweis: Starten Sie den Server bei Bedarf neu

Pavan Kumar Vempati
quelle
-1

Hier finden Sie die Lösung, führen Sie das Tool mmc -32 aus (nicht dcomcfg).

Versuchen Sie auf einem 64-Bit-System mit 32-Bit-Office Folgendes:

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

Geben Sie hier die Bildbeschreibung ein

Martín Martínez
quelle