Il recupero del factory di classe COM per il componente con CLSID {XXXX} non è riuscito a causa del seguente errore: 80040154


278

Ho sviluppato un servizio Windows utilizzando C # .NET per generare report PDF. Per generare un file PDF sto usando una DLL di terze parti. L'applicazione è in esecuzione sulla mia piattaforma Windows XP. Quando ho distribuito il servizio nella versione a 64 bit di Windows Server 2008 , ho riscontrato questo errore:

Il recupero del factory di classe COM per il componente con CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} non è riuscito a causa del seguente errore: 80040154.

Ho registrato la DLL usando il comando regsvr32. Ho potuto vedere questo CLSID nel registro. Ma il problema persiste.

Quale potrebbe essere il problema?


1
Un'applicazione web ospitata nello stesso server è in grado di generare file PDF senza errori.
gopal,

Ragazzi, ho provato tutte le possibili soluzioni ma ho ancora riscontrato questo errore. Ho assemblaggi e li ho registrati con successo ma ho ancora lo stesso errore.
Ho

Risposte:


383

In VS - proprietà del progetto - nella scheda Costruisci - target piattaforma = X86


7
in VS2008 ho trovato questa opzione in "Compila-> Opzioni di compilazione avanzate ..." (nella parte inferiore della scheda della finestra) e poi "CPU di destinazione" (x86)
Rodolfo,

1
Ti meriti più di un +1 ma +1 è tutto ciò che devo dare
David

7
Questa non è sempre la soluzione.

2
Mi hai salvato sette conti bancari offshore, una bancarella di hot dog e il mio matrimonio. Grazie
Donald.Record

2
Ho lo stesso messaggio di errore ma questa soluzione non funziona per me.
Akram Khan,

59

Ho riscontrato un problema molto simile.

Avevo bisogno di usare una vecchia DLL a 32 bit all'interno di un'applicazione Web che era stata sviluppata su un computer a 64 bit. Ho registrato la DLL a 32 bit nella cartella windows \ sysWOW64 usando la versione di regsrv32 in quella cartella.

Le chiamate alla DLL di terze parti hanno funzionato dai test unitari in Visual Studio ma non sono riuscite dall'applicazione Web ospitata in IIS sullo stesso computer con l'errore 80040154.

La modifica del pool di applicazioni in "Abilita applicazioni a 32 bit" ha risolto il problema.


1
Questo è il modo più semplice che ho trovato per risolvere questo problema. Grazie!
Dexter,

6
Adoro davvero questa risposta. Non ha senso compilare un intero sito Web per x86 quando a un certo punto chiami solo una piccola DLL a 32 bit.
DanM7,

@Daniel Ballinger La mia applicazione funzionerebbe come processo a 32 bit per apportare la modifica?
Novizio

@Danny Non ci credo, non potendo accedere alla DLL registrata in sysWOW64.
Daniel Ballinger,

1
Ho lo stesso problema, ma non so come cambiare il pool di applicazioni, dove dovrei farlo, per favore aiutami
Shima.Y

58

Sembra che il tuo servizio sia stato creato contro "Any CPU", causando errori su 64 bit in cui si utilizzano componenti COM. Devi costruirlo per x86.

Il sito Web è probabilmente in esecuzione come processo a 32 bit, motivo per cui può utilizzare il componente. La creazione della soluzione contro x86forzerà l'esecuzione del servizio a 32 bit.


Sto anche affrontando lo stesso problema ... qui la mia applicazione desktop è stata installata correttamente sul sistema a 64 bit ... durante l'installazione ho eseguito correttamente la sincronizzazione, ma quando eseguo la sincronizzazione dal mio software mi mostra l'errore sopra
Mohini Mhetre

Sto cercando di registrarmi .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)ma ricevo un errore Impossibile caricare il modulo. Assicurarsi che il file binario sia memorizzato nel percorso specificato o eseguirne il debug per verificare la presenza di problemi con i file .DLL binari o dipendenti.
Naveen Kumar,

E se viene compilato come 32 bit, è necessario utilizzare System regsvr32, non la versione SysWow64.
Fandango68,

Ricevo questo errore durante l'esecuzione del pacchetto SSIS. Le connessioni funzionano bene. Tutte le proprietà sono corrette In realtà il pacchetto SSIS era in esecuzione da molti mesi senza errori. Improvvisamente mi viene sopra l'errore. Ho provato a modificare il runtime / debug su x86 da x64 ancora il problema non è stato risolto.
IamVISH,

16

Non è necessario configurare la destinazione della piattaforma delle proprietà del progetto X86. Puoi anche configurare le opzioni di IIS per lavorare con x86 in questo modo

  • Seleziona Pool di applicazioni
  • Seleziona il pool utilizzato dalla tua app
  • Impostazioni avanzate
  • Abilita applicazioni a 32 bit true

Questo è sempre stato vero per me. Non è mai stato necessario impostare il target della piattaforma su X86 ma sempre • Abilita applicazioni a 32 bit = Vero • Imposta identità = ApplicationPoolIdentity • Carica profilo utente = Vero
Zath.

Ho avuto un problema simile che è stato risolto secondo le istruzioni di Nazim ma non ho dovuto "Incorporare tipi di interoperabilità" (una proprietà della dll di riferimento) e impostare Copia Local = true.
cymorg,

Come si seleziona "Seleziona pool di applicazioni"?
CodyBugstein,

Il menu Pool di applicazioni è nell'elenco dei menu IIS a sinistra
nazim hatipoglu,

16

Se stai cercando un modo per farlo funzionare senza ricompilare l'applicazione Any CPU, ecco un'altra potenziale soluzione:

  1. Individua il GUID dell'oggetto COM in HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Una volta individuato, aggiungere un nuovo valore REG_SZ (stringa). Il nome deve essere AppID e i dati devono essere lo stesso GUID dell'oggetto COM che hai appena cercato
  3. Aggiungi una nuova chiave in HKey_Classes_Root \ Wow6432Node \ AppID. La nuova chiave deve essere chiamata uguale al GUID dell'oggetto COM.
  4. Sotto la nuova chiave appena aggiunta, aggiungi un nuovo valore stringa e chiamalo DllSurrogate. Lascia il valore vuoto.
  5. Creare una nuova chiave in HKey_Local_Machine \ Software \ Classes \ AppID \ Ancora una volta la nuova chiave deve essere chiamata uguale al GUID dell'oggetto COM. Non è necessario aggiungere valori in questa chiave.

Non mi merito per la soluzione, ma ha funzionato per noi. Controlla il link di origine per ulteriori informazioni e altri commenti.

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


1
Le istruzioni più eccellenti. Stavo usando uno strumento di terze parti, lasciandomi incapace di cambiare la piattaforma di compilazione. Questa soluzione ha aggirato quel problema. Grazie!

Ho trovato la chiave come descritto nel passaggio 1 e quindi sapevo quale oggetto COM sta causando i problemi, quindi ho appena eseguito regsvr32 su di esso. Molte grazie!
MichaelS,

Quando l'ho fatto, il mio server web locale (IIS) ha iniziato a negare l'accesso. Questo mi dice che questo è stato un passo nella giusta direzione, ma non sono sicuro a chi dare accesso a questo punto. stackoverflow.com/questions/14019401/...
user420667

14

Il problema è che il processo del server è a 64 bit e la libreria a 32 bit e tenta di creare il componente COM nello stesso processo (server in-proc). Ricompilare il server e renderlo a 32 bit oppure lasciare invariato il server e rendere il processo COM fuori processo. Il modo più semplice per rendere out-of-process un server COM è quello di creare un'applicazione COM + - Pannello di controllo -> Strumenti di amministrazione -> Servizi componenti.


Ho riscontrato un errore durante il tentativo di creare un'applicazione COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee,

8

Non ho modificato alcuna impostazione di compilazione.

Basta impostare "Abilita applicazione a 32 bit = Vero" in Impostazioni avanzate AppPool.

Ha funzionato per me


1
Dove si trovano le impostazioni avanzate di AppPool?
CodyBugstein,

7

La soluzione per Windows 2008 Server x64 è:

  1. aprire cmd.exe con il permesso di amministratore.
  2. Copia la dll nella cartella C: \ Windows \ SysWOW64
  3. eseguire regsvr32 da C: \ Windows \ SysWOW64
  4. Verificare che la dll sia nel registro di Windows.
  5. Se hai un .exe x86 che usa la dll, l'exe deve essere compilato in modalità x86.
  6. L'exe deve essere installato nella cartella C: \ Programmi (x86)

Questa procedura è valida, è ok.


6

Ho avuto lo stesso problema, ma le altre risposte hanno fornito solo una parte della soluzione.

La soluzione è duplice:

Rimuovere il 64 bit dal registro.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Ciò non rimuoverà i riferimenti ad altri copiati della DLL in altre cartelle.

o

  • Trova la chiave denominata HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Questa chiave avrà il nome file della DLL come valore predefinito.
  • Ho rimosso la cartella HKEY_CLASSES_ROOT \ CLSID {......}.

Registralo come 32 bit:

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

Registrarlo come 32 bit senza rimuovere la registrazione a 64 bit non risolve il mio problema.


Bingo! Questa è la risposta che stavo cercando (vedi i miei commenti altrove). Grazie!
Fandango68,

5

Si è verificato un problema correlato con una correzione diversa, ma simile:

Ho avuto un progetto di servizio di Windows impostato su "Any-CPU" utilizzando una DLL a 64 bit. Stesso messaggio di errore. Ho provato un sacco di cose, ma niente ha funzionato. Infine, sono entrato in Proprietà del progetto -> Crea e ho notato che il progetto aveva "Preferisci 32 bit" controllato. Deselezionato questo e non più errori.

La mia ipotesi è che il servizio Windows si aspettasse una DLL a 32 bit e non è riuscito a trovarlo.


Anche se è strano ma funziona !! Grazie
FindOutIslamNow,

3

Per passare a x86:

  1. Crea un progetto di installazione per la tua soluzione.
  2. Dopo averlo creato, vai a Esplora soluzioni, fai clic con il pulsante destro del mouse sul progetto di installazione.
    • Premi Configuration Manager.
    • Fai clic su: casella combinata "Piattaforma soluzione attiva" e seleziona Nuovo (se non viene visualizzato x86)
    • Selezionare dalla prima combo x86 quindi premere OK.
    • ricostruire il progetto di installazione, quindi ricostruire tutto il progetto.

3

Se stai gestendo un sito Web, puoi anche provare a impostare il pool di applicazioni in modo che disabiliti le applicazioni a 32 bit (nelle impostazioni avanzate di un pool).


2
Avevo il contrario e ho dovuto abilitare le applicazioni a 32 bit.
row1

2

Nel mio caso personale il problema è stato risolto cercando l'id della classe nel registro di Windows sul computer dello sviluppatore (perché il problema era stato generato in un PC client). Questa azione verrà inserita nel componente COM che causa il problema: una libreria x86 referenziata nel mio progetto .NET che non era registrata come OCX / COM per l'applicazione di installazione o aggiornamento.

Saluti


1

Per chiunque utilizzasse VSTO, il problema per me era un riferimento mancante officeall'assemblaggio. Sembrerebbe anche se si stesse provando a creare un'istanza di determinati oggetti VSTO manualmente.


1

Ho scoperto che il mio problema riguardava l'effettiva registrazione della DLL.

Prima esegui "Regedit.exe" da un prompt CMD (ho innalzato il livello di sicurezza ad Amministratore, "per ogni evenienza"), quindi cerca nel registro (facendo clic su "Modifica / Trova" nel menu RegEdit o premendo Ctrl + F) per il CLSID visualizzato nel messaggio di errore ricevuto relativo al factory di classe COM. Il mio CLSID era 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Quando viene trovata questa chiave, selezionare la sottochiave "InProcServer2" sotto quel nodo Hive e accertare il nome file della DLL problematica nel riquadro Regedit a destra. visualizzato in "Predefinito". Se il file si trova in "C: \ Windows \ SysWow64" (come C: \ Windows \ SysWow64 \ Redemption.dll "), è importante utilizzare il file" C: \ Windows \ SysWow64 \ RegSvr32.exe "per registra quella DLL dalla riga di comando e NON l'impostazione predefinita "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll premere Invio. Chiudi la finestra di comando (tramite "Esci", quindi riavvia il computer (usa sempre riavvia invece di Chiudi, quindi avvia, poiché (stranamente) Riavvia esegue un arresto completo e ricarica tutto mentre "Spegni" e Ricarica ricaricano un cache memorizzata di driver e altri valori (che potrebbero essere difettosi). Ogni volta che si registra una DLL in futuro, ricordarsi di utilizzare SysWow64 "RegSvr32.exe" per qualsiasi DLL memorizzata nella cartella C: \ Windows \ SysWow64 e questo problema c (se è causato da una registrazione errata) non dovrebbe ripetersi.


Ottimo consiglio, ma tieni presente che la registrazione di una DLL a 32 bit in SysWow64 quindi si presume che la DLL abbia un wrapper per gestire le richieste a 64 bit.
Fandango68,

0

Il mio problema era che avevo la versione MS Sync FrameWork (1.0) sbagliata nei riferimenti del mio progetto. Dopo l'aggiornamento alla versione 2.1, l'errore era sparito e la vita è di nuovo buona.


0

Nel mio caso, sto producendo file MS Office come wordo excel, corro Win+Red eseguo dcomcnfg, nella configurazione DCOM, oltre a selezionare l'elemento del nome correlato a OFFICE (come il nome contiene Excelo Wordo Office) e Open the properties, select Identity tab and select the interactive user.come questa risposta ,

Il mio messaggio di errore mostra CLSID {000209FF-0000-0000-C000-000000000046}, quindi devo provare a trovare questo CLSID specifico in DCOM Config, ed esce, lo seleziono e seguo lo stesso passo impostato interactive user, quindi funziona.

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.