A recuperação do factory de classe COM para o componente com CLSID {XXXX} falhou devido ao seguinte erro: 80040154

278

Desenvolvi um serviço Windows usando C # .NET para gerar relatório em PDF. Para gerar arquivo PDF, estou usando uma DLL de terceiros. O aplicativo está sendo executado na minha plataforma Windows XP. Quando implantei o serviço na versão de 64 bits do Windows Server 2008 , recebi este erro:

A recuperação do factory de classe COM para o componente com CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} falhou devido ao seguinte erro: 80040154.

Registrei a DLL usando o comando regsvr32. Eu consigo ver esse CLSID no registro. Mas o problema persiste.

Qual poderia ser o problema?

gopal
fonte
1
Um aplicativo da web hospedado no mesmo servidor pode gerar arquivo PDF sem nenhum erro.
Gopal
Gente eu tentei todas as soluções possíveis, mas ainda estou recebendo esse erro. Tenho assemblies e os registrei com sucesso, mas ainda estou recebendo o mesmo erro. Really need help ...
newprogress

Respostas:

383

No VS - propriedades do projeto - na guia Compilar - destino da plataforma = X86

Fabrice MARIANADIN
fonte
7
no VS2008, encontrei essa opção em 'Compilar-> Opções avançadas de compilação ...' (na parte inferior da guia da janela) e depois em 'Target CPU' (x86)
Rodolfo
1
Você merece mais do que um +1, mas o +1 é tudo o que tenho para dar #
David David
7
Essa nem sempre é a solução.
2
Você me salvou sete contas bancárias no exterior, uma banca de cachorro-quente e meu casamento. Obrigado
Donald.Record
2
Tenho a mesma mensagem de erro, mas esta solução não funciona para mim.
Akram Khan
59

Corri para um problema muito semelhante.

Eu precisava usar uma DLL de 32 bits antiga em um Aplicativo da Web que estava sendo desenvolvido em uma máquina de 64 bits. Registrei a DLL de 32 bits na pasta windows \ sysWOW64 usando a versão do regsrv32 nessa pasta.

As chamadas para a DLL de terceiros funcionaram a partir de testes de unidade no Visual Studio, mas falharam no Aplicativo Web hospedado no IIS na mesma máquina com o erro 80040154.

Alterar o pool de aplicativos para "Ativar aplicativos de 32 bits" resolveu o problema.

Daniel Ballinger
fonte
1
Essa é a maneira mais fácil que encontrei para corrigir esse problema. Obrigado!
Dexter
6
Eu realmente amo essa resposta. Não faz sentido compilar um site inteiro para x86 quando você está chamando apenas uma pequena DLL de 32 bits em algum momento.
DanM7
@ Daniel Ballinger Meu aplicativo seria executado como um processo de 32 bits ao fazer a alteração?
Novice
@ Danny Eu não acredito, pois não seria capaz de acessar a DLL que eu registrei no sysWOW64.
Daniel Ballinger
1
Eu tenho o mesmo problema, mas eu não sei como mudar do pool de aplicativos, onde eu deveria fazer isso, plz me ajudar
Shima.Y
58

Parece que seu serviço foi criado com 'Qualquer CPU', causando erros em 64 bits em que você está usando componentes COM. Você precisa construí-lo para x86.

O site provavelmente está sendo executado como um processo de 32 bits e é por isso que ele pode usar o componente. Construir sua solução x86fará com que seu serviço seja executado em 32 bits.

stevehipwell
fonte
Eu também estou enfrentando mesma problem..here minha aplicação desktop está instalado com sucesso em 64 bits system..while fazer a instalação eu fiz a sincronização com êxito, mas quando quando eu faço a sincronização do meu software que está me mostrando acima de erro
Mohini Mhetre
Estou tentando registrar, .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)mas estou recebendo erro O módulo falhou ao carregar. Verifique se o binário está armazenado no caminho especificado ou depure-o para verificar problemas nos arquivos .DLL binários ou dependentes.
Naveen Kumar
E se for compilado como 32 bits, o Regsvr32 do sistema deve ser usado, não a versão do SysWow64.
Fandango68
Estou recebendo esse erro ao executar o pacote SSIS. As conexões estão funcionando bem. Todas as propriedades estão corretas. Na verdade, o pacote SSIS estava em execução há muitos meses sem nenhum erro. De repente, estou ficando acima do erro. Tentei alterar o tempo de execução / depuração para x86 do problema x64 ainda não foi resolvido.
IamVISH
16

Você não precisa configurar o destino da plataforma de propriedades do projeto X86. Você também pode configurar as opções do iis para trabalhar com x86 assim

  • Selecionar pool de aplicativos
  • Selecione o pool que seu aplicativo usa
  • Configurações avançadas
  • Ativar aplicativos de 32 bits true
nazim hatipoglu
fonte
Isso sempre foi verdade para mim. Nunca foi necessário definir o destino da plataforma como X86, mas sempre • Habilitar aplicativos de 32 bits = True • Definir identidade = ApplicationPoolIdentity • Carregar perfil do usuário = True
Zath.
Eu tive um problema semelhante que foi corrigido de acordo com as instruções de Nazim, mas também não tive que "Incorporar tipos de interoperabilidade" (uma propriedade da dll referenciada) e definir Copiar local = true.
Cymorg 17/06/16
Como você "seleciona pool de aplicativos"?
CodyBugstein
Menu de pools de aplicativos está na lista de iis menu à esquerda
nazim Hatipoglu
16

Se você está procurando uma maneira de fazer isso funcionar sem recompilar o aplicativo Any CPU, aqui está outra solução potencial:

  1. Localize o GUID do objeto COM em HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Uma vez localizado, adicione um novo valor REG_SZ (string). O nome deve ser AppID e os dados devem ser o mesmo GUID do objeto COM que você acabou de pesquisar
  3. Adicione uma nova chave em HKey_Classes_Root \ Wow6432Node \ AppID. A nova chave deve ser chamada da mesma forma que o GUID do objeto COM.
  4. Sob a nova chave que você acabou de adicionar, adicione um novo Valor da String e chame-o de DllSurrogate. Deixe o valor em branco.
  5. Crie uma nova chave em HKey_Local_Machine \ Software \ Classes \ AppID \ Novamente, a nova chave deve ser chamada da mesma forma que o GUID do objeto COM. Nenhum valor é necessário para ser adicionado sob essa chave.

Não aceito crédito pela solução, mas funcionou para nós. Verifique o link da fonte para obter mais informações e outros comentários.

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

Joshua Starner
fonte
1
Mais excelentes instruções. Eu estava usando uma ferramenta de terceiros, deixando-me incapaz de alterar a plataforma de compilação. Esta solução contornou esse problema. Obrigado!
Encontrei a chave como você descreveu na etapa 1 e, então, soube qual objeto COM está causando problemas, então apenas executei o regsvr32. Muito obrigado!
precisa saber é
Quando eu fiz isso, meu servidor local (IIS) começou a ter acesso negado. Isso me diz que este foi um passo na direção certa, mas não tenho certeza a quem conceder acesso neste momento. stackoverflow.com/questions/14019401/…
user420667
14

O problema é que o processo do servidor é de 64 bits e a biblioteca é de 32 bits e tenta criar o componente COM no mesmo processo (servidor em processo). Você recompila o servidor e o torna em 32 bits ou deixa o servidor inalterado e torna o componente COM fora de processo. A maneira mais fácil de tornar um servidor COM fora de processo é criar um aplicativo COM + - Painel de Controle -> Ferramentas Administrativas -> Serviços de Componentes.

dente afiado
fonte
Encontrei um erro ao tentar criar um aplicativo COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee
8

Não alterei nenhuma configuração de compilação.

Basta definir "Ativar aplicativo de 32 bits = True" nas Configurações avançadas do AppPool.

Funcionou para mim

Eduardo Xavier
fonte
1
Onde estão as configurações avançadas do AppPool?
CodyBugstein
7

A solução para o Windows 2008 Server x64 é:

  1. abra cmd.exe com permissão de administrador.
  2. Copie a dll para a pasta C: \ Windows \ SysWOW64
  3. execute o regsvr32 em C: \ Windows \ SysWOW64
  4. Verifique se a dll está no registro do Windows.
  5. Se você possui um .exe x86 que usa a dll, o exe deve ser compilado no modo x86.
  6. O exe deve estar instalado na pasta C: \ Arquivos de Programas (x86)

Este procedimento é válido, está ok.

Juan
fonte
6

Eu tive o mesmo problema, mas as outras respostas forneceram apenas uma parte da solução.

A solução é duas vezes:

Remova os 64 bits do registro.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Isso não removerá referências para outras cópias da dll em outras pastas.

ou

  • Localize a chave chamada HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Essa chave terá o nome do arquivo da DLL como valor padrão.
  • Eu removi a pasta HKEY_CLASSES_ROOT \ CLSID {......}.

Registre-o como 32 bits:

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

Registrá-lo como 32 bits sem remover o registro de 64 bits não resolve meu problema.

Gerhard Powell
fonte
Bingo! Essa é a resposta que eu estava procurando (veja meus comentários em outro lugar). Obrigado!
Fandango68
5

Teve um problema relacionado com uma correção diferente, mas semelhante:

Eu tinha um projeto de serviço do Windows definido como "Qualquer CPU" usando uma DLL de 64 bits. A mesma mensagem de erro. Tentei um monte de coisas, mas nada funcionou. Finalmente, entrei no projeto Propriedades -> Compilar e notei que o projeto tinha "Preferir 32 bits" marcado. Desmarcado e sem mais erros.

Meu palpite é que o serviço Windows esperava uma DLL de 32 bits e não conseguiu encontrá-la.

jinushaun
fonte
Embora isso seja estranho, mas funciona! Obrigado
FindOutIslamNow 7/17/17
3

Para mudar para x86:

  1. Crie um projeto de instalação para sua solução.
  2. Depois de criá-lo, vá para o Solution Explorer, clique com o botão direito do mouse no projeto de instalação.
    • Pressione o Gerenciador de configuração.
    • Clique em: caixa de combinação "Active Solution Platform" e selecione New (se não houver x86 exibido)
    • Selecione a partir do primeiro combo x86 e pressione OK.
    • reconstruir o projeto de instalação e, em seguida, reconstruir todo o projeto.
ShouShouLeb
fonte
3

Se você estiver executando um site, também poderá tentar definir seu pool de aplicativos para desativar os Aplicativos de 32 bits (nas configurações avançadas de um pool).

scramblor
fonte
2
Eu tinha o oposto e precisava habilitar aplicativos de 32 bits.
linha1:
2

No meu caso pessoal, o problema foi corrigido, procurando a identificação da classe no registro do Windows na máquina do desenvolvedor (porque o problema foi lançado em um PC cliente). Esta ação será colocada no componente COM que causa o problema: uma biblioteca x86 mencionada no meu projeto .NET que não estava sendo registrada como OCX / COM para o aplicativo instalador ou atualizador.

Saudações

César Qüeb
fonte
1

Para quem usa o VSTO, o problema para mim era uma referência ausente ao officeassembly. Também apareceria se você estivesse tentando instanciar certos objetos VSTO manualmente.

Alex
fonte
1

Eu descobri que meu problema estava relacionado ao registro real da DLL.

Primeiro execute o "Regedit.exe" em um prompt do CMD (aumentei o nível de segurança para Administrador, "apenas no caso") e, em seguida, procure o Registro (clicando em "Editar / Localizar" no menu RegEdit ou pressionando Ctrl + F) para o CLSID que aparece na mensagem de erro que você recebeu sobre o factory de classe COM. Meu CLSID era 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Quando essa chave for encontrada, selecione a subchave "InProcServer2" no nó Hive e verifique o nome do arquivo da DLL do problema no quadro Regedit à direita. mostrando em "Padrão". Se esse arquivo residir em "C: \ Windows \ SysWow64" (como C: \ Windows \ SysWow64 \ Redemption.dll "), é importante que você use o arquivo" C: \ Windows \ SysWow64 \ RegSvr32.exe "para registre essa DLL na linha de comando e NÃO o padrão "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll, pressione a tecla Enter. Feche a janela de comando (via "Sair" e, em seguida, reinicie o computador (sempre use reiniciar em vez de Fechar e, em seguida, inicie, pois (estranhamente) o Reinício efetua um completo desligamento e recarregamento de tudo, enquanto "Desligar" e o Power-Up recarregam um cache armazenado de drivers e outros valores (que podem estar com defeito.) Sempre que você registrar uma DLL no futuro, lembre-se de usar o SysWow64 "RegSvr32.exe" para qualquer DLL armazenada na pasta C: \ Windows \ SysWow64 e esse problema (se for causado por registro incorreto) não deve ocorrer novamente.

Chris Raisin
fonte
Ótima dica, mas esteja ciente de que ao registrar uma DLL de 32 bits no SysWow64, presume-se que a DLL tenha um wrapper para lidar com solicitações de 64 bits.
perfil
0

Meu problema era que eu tinha a versão errada do MS Sync FrameWork (1.0) nas referências do meu projeto. Após a atualização para a versão 2.1, o erro desapareceu e a vida é boa novamente.

Phogrammer
fonte
0

No meu caso, estou produzindo um arquivo do ms office como wordou excel, executo Win+Re executo dcomcnfg, no DCOM Config, além de selecionar o item de nome relacionado ao OFFICE (como nome contém Excelou Wordou Office) e, Open the properties, select Identity tab and select the interactive user.como esta resposta ,

Minha mensagem de erro é exibida CLSID {000209FF-0000-0000-C000-000000000046}, então eu tenho que tentar encontrar esse CLSID específico no DCOM Config, e ele existe, e eu o seleciono e sigo a mesma etapa definida interactive user, então funciona.

yu yang Jian
fonte