Come risolvere la classe di eccezione COM non registrata (eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?


93

Quando provo a creare un'istanza di una classe COM, viene generata un'eccezione come

Classe non registrata (eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Per favore suggerisci come potrei risolverlo?


1
Puoi fornire maggiori dettagli con un po 'di codice?
Xaisoft

10
Ci sono due domande: 1.Hai installato / registrato il componente COM sulla macchina Windows 7 x64? 2. Qual è la piattaforma di destinazione della tua applicazione, penso che dovresti impostare la piattaforma su x86, per favore non impostarla come "Qualsiasi CPU"? Si prega di registrare prima la COM e quindi eseguire per testare l'applicazione, fare riferimento al documento: support.microsoft.com/kb/146219 e Spiegazione dell'utilizzo di Regsvr32 e messaggi di errore
JackWang

L'ho risolto senza modificare l'obiettivo di compilazione in "x86". Soluzione nel link: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Risposte:


49

Sembra che qualsiasi programma o processo che stai tentando di inizializzare non sia installato sulla tua macchina, abbia un'installazione danneggiata o debba essere registrato.

Installalo, riparalo (tramite Aggiungi / Rimuovi programmi) o registralo (tramite Regsvr32.exe).

Non ci hai fornito informazioni sufficienti per aiutarti più di questo.


4
Penso che volevi dire RegSvr32.exe (al contrario di RegSrv32.exe).
windowsgm

60

È necessario assicurarsi che tutti gli assembly vengano compilati per l'architettura corretta. Prova a cambiare l'architettura per x86 se la reinstallazione del componente COM non funziona.


Questo ha risolto il mio processo che non trovava il client NAV 2009 R2 (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Vincent Vancalbergh

14

Il mio problema e la soluzione

Ho una dll di terze parti a 32 bit che ho installato nella macchina 2008 R2 che è a 64 bit.

Ho un servizio wcf creato nel framework .net 4.5 che chiama la dll di terze parti a 32 bit per il processo. Ora ho la proprietà build impostata per targetizzare "qualsiasi" cpu e l'ho distribuita sulla macchina a 64 bit.

quando ho provato a richiamare il servizio wcf ho ricevuto l'errore "80040154 Classe non registrata (eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

Ora ho utilizzato ProcMon.exe per tracciare il problema del registro com e ho identificato che il processo sta cercando la voce di registro in HKLM \ CLSID e HKCR \ CLSID dove non è presente alcuna voce.

È venuto a sapere che Microsoft non registrerà i componenti com a 32 bit nei percorsi HKLM \ CLSID, HKCR \ CLSID nella macchina a 64 bit piuttosto colloca la voce nei percorsi HKLM \ Wow6432Node \ CLSID e HKCR \ Wow6432Node \ CLSID.

Ora il conflitto è un processo a 64 bit che tenta di richiamare il processo a 32 bit in una macchina a 64 bit che cercherà la voce di registro in HKLM \ CLSID, HKCR \ CLSID. La soluzione è che dobbiamo forzare il processo a 64 bit a guardare la voce di registro in HKLM \ Wow6432Node \ CLSID e HKCR \ Wow6432Node \ CLSID.

Ciò può essere ottenuto configurando le proprietà del progetto del servizio wcf in modo che si indirizzino alla macchina "X86" invece che a "Qualsiasi".

Dopo aver distribuito la versione "X86" sul server 2008 R2, è stato riscontrato il problema "System.BadImageFormatException: Impossibile caricare il file o l'assembly"

La soluzione a questa badimageformatexception è l'impostazione di "Enable32bitApplications" su "True" nelle proprietà Apppool IIS per l'apppool corretto.


Si prega di non pubblicare risposte identiche a più domande. Pubblica una buona risposta, quindi vota / contrassegna per chiudere le altre domande come duplicati. Se la domanda non è un duplicato, adatta le tue risposte alla domanda .
kleopatra

10

Notare inoltre che il contesto della classe durante l'inizializzazione può creare quell'eccezione. Se hai un oggetto codificato come INPROC_SERVER ma provi a CoCreateInstance come CLSCTX_LOCAL_SERVER, riceverai anche quell'errore.

È necessario assicurarsi che l'oggetto sia registrato e che CoCreateInstance stia creando un'istanza con il contesto di classe corretto.


Sì, se per esempio provi a creare DesktopWallpaperusando CLSCTX_INPROC(invece di CLSCTX_ALL) otterrai l' 0x80040154 (REGDB_E_CLASSNOTREG)errore.
user362515

9

Se si utilizzano componenti COM a 64 bit in un'applicazione Web su IIS, assicurarsi che il pool di applicazioni sia impostato per non consentire applicazioni a 32 bit ( Abilita applicazioni a 32 bit: false nelle impostazioni avanzate)


5

Ho funzionato abilitando le applicazioni a 32 bit nelle impostazioni avanzate del pool di applicazioni. Fare clic con il pulsante destro del mouse sul pool di applicazioni e scegliere le impostazioni avanzate - abilitare le applicazioni a 32 bit. Questo può aiutare qualcuno là fuori.


Stessa cosa per me. Una dll a 32 bit utilizzata su una macchina di sviluppo a 64 bit, test a 64 bit e server live a 64 bit. Ha funzionato bene sulla scatola di sviluppo. Quando distribuito sui server di prova e live, non è riuscito fino a quando le app a 32 bit non sono state consentite nei rispettivi pool di app IIS e i pool non sono stati riavviati. Ho anche dovuto disattivare "Embed Interop Types" (un'impostazione sulla dll incriminata in VS) e impostare "Copy Local" = true per assicurarmi che la dll fosse effettivamente copiata nella sua forma originale sui server.
cymorg

3

Registrando la classe (in particolare il suo CLSID) - vedere ad esempio qui .


Potrebbe anche essere un oggetto che deve essere installato sulla sua macchina o server, non necessariamente una registrazione della classe.
Xaisoft

@Xaisoft, "installazione" in genere implica "registrazione", come menziona l'URL MSDN che ho indicato.
Alex Martelli

3

nel mio caso

my platform è x64

the Dll library(sdk)e redistributable packageè x64

così

  1. in Esplora soluzioni navigate to your project

  2. Aperto Properties

  3. change the Platform target from AnyCPU to x64

inserisci qui la descrizione dell'immagine


2

Il modo in cui ho risolto questo problema è stato registrare il COMviaregsvr32 .

assicurati che la COM che stai invocando sia registrata.

La mia applicazione era in uso xceedcry.dlle non la stavo registrando. Una volta registrato, l'applicazione ha funzionato bene.


2

La mia soluzione è stata quella di modificare " Abilita applicazioni a 32 bit " su True nelle impostazioni avanzate del relativo pool di app in IIS.

Pool di app

Abilita applicazioni a 32 bit


2

Nel mio caso la classe è stata registrata correttamente e costruita in QUALSIASI CPU / 64 bit modalità .

Ma la proprietà Abilita applicazioni a 32 bit del pool di applicazioni IIS dell'applicazione che utilizza la classe era impostata su True .

La classe non è stata trovata a causa della mancata corrispondenza dell'architettura tra la configurazione del pool di applicazioni e la classe effettivamente registrata.

L'impostazione Abilita applicazioni a 32 bit su False ha risolto il problema. Impostazioni del pool di app IIS


1

Per me, ho dovuto creare una configurazione di build a 64 bit.


1

Ho avuto lo stesso problema utilizzando MapWinGis. Ho trovato la soluzione, lavorando su visual studio 2015 windows forms proyect, basta fare clic destro sul progetto-> proprietà-> Build, impostare la configurazione su Tutte le configurazioni e nel conbobox "platform target" impostarlo a x64.


0

Mi sono imbattuto in questo problema chiamando un assembly .Net da un client C ++ tramite COM. Risulta che non è stato possibile trovare uno degli assembly da cui dipendeva l'assembly .Net. Ho lottato per un po 'cercando di capire cosa c'era di sbagliato nel primo assembly, ma in realtà era una delle dipendenze del primo assembly. Ho ricevuto due diversi errori durante la chiamata a CoCreateInstance () dal client C ++. Il primo era: REGDB_E_CLASSNOTREG Classe non registrata e il secondo tentativo era: 0x80131040: la definizione manifest dell'assembly individuato non corrisponde al riferimento all'assembly.

Quindi controlla che i riferimenti del tuo assembly siano presenti. L'ho scoperto sfogliando il primo assembly con dotPeek e notando che mancava uno dei suoi riferimenti. Posizionare la versione corretta della dipendenza nella cartella ha risolto entrambi gli errori.


0

Stavo compilando la mia applicazione mirata a qualsiasi CPU e il problema principale si è scoperto che adobe reader è stato installato il vecchio v10.x deve aggiornare v11.x , questo è il modo in cui riesco a risolvere questo problema.


0

Ho riscontrato lo stesso problema utilizzando una classe COM, ovvero "Eccezione di classe non registrata" in fase di esecuzione. Per me sono stato in grado di risolvere andando al file app.config e cambiare gli elementi "startup" e "supportedRuntime" in qualcosa di simile:

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

Puoi leggere di più sui dettagli qui http://stackoverflow.com/questions/1604663/

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

Dovrei notare che sto eseguendo Visual Studio 2017. Target cpu = x86 Embed Interop Type = true (nella finestra delle proprietà)


0

vai alla directory di .Net framework e registra la rispettiva dll con il percorso dll spazio vuoto Regsvr32.exe .


0

Ho affrontato lo stesso problema. Dopo aver fatto qualche ricerca ho trovato la soluzione per me e potrebbe essere utile. Il problema non è solo correlato alla reinstallazione come da mia osservazione, dipende anche dalle autorizzazioni di accesso.

Passaggio 1: riparare il particolare oggetto COM.

Passaggio 2: Servizi componenti> Computer> Risorse del computer> Configurazione DCOM> Seleziona il tuo oggetto COM> Fare clic con il pulsante destro del mouse> Proprietà> scheda Protezione> Autorizzazioni di accesso> Scegli Personalizza> Fai clic su MODIFICA> Seleziona IIS_USER (se non esiste, crea con diritti completi) e dai completo accedere e fare clic su OK.

Passare alla scheda Identità> È possibile selezionare "Utente interattivo" o "Questo utente"> Fare clic su Applica e OK. Se scegli "Questo utente", dobbiamo fornire l'utente con privilegi di amministratore a quel server

Passaggio 3: aprire Gestione IIS> Riavvia i pool di applicazioni.

Nota: se necessario, riavviare il server


-1

Qui trova la soluzione, esegui lo strumento mmc -32 (non dcomcfg)

Su un sistema a 64 bit con Office a 32 bit, prova questo:

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.