Como resolver a classe de exceção COM não registrada (exceção de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?

92

Quando tento criar uma instância de uma classe COM, ele lança uma exceção como

Classe não registrada (exceção de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Por favor, sugira como eu poderia resolver isso?

Jaswant Agarwal
fonte
1
Você pode dar mais detalhes com algum código?
Xaisoft
10
Há duas perguntas: 1. Você instalou / registrou o componente COM na máquina Windows 7 x64? 2. Qual é a plataforma de destino do seu aplicativo, eu acho que você deve definir a plataforma para x86, por favor, não defina como "Qualquer CPU"? Registre o COM primeiro e, em seguida, execute para testar o aplicativo; consulte o documento: support.microsoft.com/kb/146219 e Explicação do uso do Regsvr32 e mensagens de erro
JackWang
Eu resolvi isso sem alterar o destino de compilação para 'x86'. Solução no link: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Respostas:

48

Parece que qualquer programa ou processo que você está tentando inicializar não está instalado em sua máquina, tem uma instalação danificada ou precisa ser registrado.

Instale-o, repare-o (por meio de Adicionar / Remover Programas) ou registre-o (via Regsvr32.exe).

Você não forneceu informações suficientes para ajudá-lo mais do que isso.

Jay Riggs
fonte
4
Pense que você quis dizer RegSvr32.exe (como opor RegSrv32.exe).
windowsgm
60

Você precisa ter certeza de que todos os seus assemblies estão compilando para a arquitetura correta. Tente mudar a arquitetura para x86 se reinstalar o componente COM não funcionar.

Andy Fiedler
fonte
Isso resolveu meu processo de não encontrar o cliente NAV 2009 R2 (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Vincent Vancalbergh
14

Meu problema e a solução

Eu tenho uma dll de terceiros de 32 bits que instalei na máquina 2008 R2, que é de 64 bits.

Eu tenho um serviço wcf criado na estrutura .net 4.5 que chama a dll de terceiros de 32 bits para o processo. Agora eu tenho a propriedade de construção definida para ter como alvo 'qualquer' cpu e implantei na máquina de 64 bits.

quando tentei invocar o serviço wcf, obtive o erro "80040154 Classe não registrada (exceção de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

Agora eu usei ProcMon.exe para rastrear o problema de registro COM e identifiquei que o processo está procurando a entrada do registro em HKLM \ CLSID e HKCR \ CLSID onde não há entrada.

Soube que a Microsoft não registrará os componentes de comunicação de 32 bits nos caminhos HKLM \ CLSID, HKCR \ CLSID na máquina de 64 bits, em vez de colocar a entrada nos caminhos HKLM \ Wow6432Node \ CLSID e HKCR \ Wow6432Node \ CLSID.

Agora, o conflito é um processo de 64 bits tentando invocar o processo de 32 bits na máquina de 64 bits que procurará a entrada do registro em HKLM \ CLSID, HKCR \ CLSID. A solução é forçar o processo de 64 bits a examinar a entrada do registro em HKLM \ Wow6432Node \ CLSID e HKCR \ Wow6432Node \ CLSID.

Isso pode ser alcançado configurando as propriedades do projeto de serviço wcf para direcionar para a máquina 'X86' em vez de 'Qualquer'.

Depois de implantar a versão 'X86' no servidor 2008 R2, surgiu o problema "System.BadImageFormatException: não foi possível carregar o arquivo ou montagem"

A solução para este badimageformatexception é definir 'Enable32bitApplications' como 'True' nas propriedades de Apppool do IIS para o apppool certo.

Waheed
fonte
Por favor, não poste respostas idênticas para várias perguntas. Poste uma boa resposta e, em seguida, vote / sinalize para fechar as outras questões como duplicatas. Se a pergunta não for uma duplicata, adapte suas respostas à pergunta .
kleopatra
10

Observe também que o contexto da classe ao inicializar pode criar essa exceção. Se você tiver um objeto codificado como INPROC_SERVER, mas tentar CoCreateInstance como CLSCTX_LOCAL_SERVER, também obterá esse erro.

Você precisa se certificar de que o objeto está registrado e o CoCreateInstance está criando uma instância com o contexto de classe correto.

Andrew Keith
fonte
Sim, se, por exemplo, você tentar criar DesktopWallpaperusando CLSCTX_INPROC(em vez de CLSCTX_ALL), obterá o 0x80040154 (REGDB_E_CLASSNOTREG)erro.
user362515
9

Se você estiver usando componentes COM de 64 bits em um aplicativo da web no IIS, certifique-se de que o pool de aplicativos esteja definido para não permitir aplicativos de 32 bits ( Habilitar aplicativos de 32 bits: falso nas configurações avançadas)

Matsen75
fonte
5

Comecei a trabalhar habilitando aplicativos de 32 bits nas configurações avançadas do pool de aplicativos. Clique com o botão direito do mouse no pool de aplicativos e escolha as configurações avançadas - habilitar aplicativos de 32 bits. Isso pode ajudar alguém lá fora.

Yoky
fonte
O mesmo para mim. Uma dll de 32 bits usada em uma máquina de desenvolvimento de 64 bits, teste de 64 bits e servidor ao vivo de 64 bits. Funcionou bem na caixa de desenvolvimento. Quando implantado nos servidores de teste e ativos, ele falhou até que os aplicativos de 32 bits fossem permitidos nos respectivos pools de aplicativos IIS e os pools reiniciados. Eu também tive que desligar "Embed Interop Types" (uma configuração na dll ofensiva no VS) e definir "Copy Local" = true para ter certeza de que a dll foi realmente copiada em sua forma original para os servidores.
cymorg
3

Ao registrar a classe (especificamente seu CLSID) - veja, por exemplo, aqui .

Alex Martelli
fonte
Pode ser também algum objeto que precise ser instalado em sua máquina ou servidor, não necessariamente um cadastro da turma.
Xaisoft
@Xaisoft, "instalação" normalmente envolve "registro", como o url do MSDN que apontei menciona.
Alex Martelli
3

No meu caso

my platform é x64

the Dll library(sdk)e o redistributable packageé x64

tão

  1. no explorador de soluções navigate to your project

  2. abrir Properties

  3. change the Platform target from AnyCPU to x64

insira a descrição da imagem aqui

Basheer AL-MOMANI
fonte
2

A maneira que resolvi esse problema foi cadastrando o COMvia regsvr32.

certifique-se de que o COM que você está chamando esteja registrado.

Meu aplicativo estava usando xceedcry.dlle eu não estava registrando. Depois de registrá-lo, o aplicativo funcionou bem.

CesarB
fonte
2

Minha solução foi alterar " Habilitar aplicativos de 32 bits " para Verdadeiro nas configurações avançadas do pool de aplicativos relativo no IIS.

Pool de aplicativos

Habilitar aplicativos de 32 bits

Adrian
fonte
2

No meu caso, a classe foi registrada corretamente e construída em QUALQUER CPU / modo de 64 bits .

Mas a propriedade Habilitar aplicativos de 32 bits do pool de aplicativos IIS do aplicativo que usa a classe foi definida como True .

A classe não foi encontrada devido à incompatibilidade de arquitetura entre a configuração do pool de aplicativos e a classe registrada real.

Definir Ativar aplicativos de 32 bits como Falso corrigiu o problema. Configurações do pool de aplicativos IIS

Bhupinderjit Dhanoa
fonte
1

Para mim, tive que criar uma configuração de compilação de 64 bits.

jbooker
fonte
1

Eu tive o mesmo problema ao usar o MapWinGis. Eu encontrei a solução, trabalhando no projeto do Windows Forms do Visual Studio 2015, basta clicar com o botão direito do mouse no projeto-> Propriedades-> Build, definir a configuração para Todas as configurações e no conbobox "plataforma alvo" definir para x64.

Deydra A
fonte
0

Corri para este problema ao chamar um assembly .Net de um cliente C ++ via COM. Acontece que um dos assemblies do qual o assembly .Net dependia não foi encontrado. Lutei um pouco tentando descobrir o que havia de errado com a 1ª montagem, mas na verdade era uma das dependências da 1ª montagem. Recebi dois erros diferentes ao chamar CoCreateInstance () do cliente C ++. A primeira foi: REGDB_E_CLASSNOTREG Classe não registrada E a segunda tentativa foi: 0x80131040: A definição de manifesto do assembly localizado não corresponde à referência do assembly.

Portanto, verifique se as referências de sua montagem estão presentes. Eu descobri isso navegando na primeira montagem com dotPeek e percebendo que faltava uma de suas referências. Colocar a versão correta da dependência na pasta resolveu os dois erros.

Sean B
fonte
0

Eu estava compilando meu aplicativo visando qualquer CPU e o problema principal descobriu que o adobe reader foi instalado mais antigo v10.x precisa atualizar v11.x , esta é a maneira como eu consigo resolver esse problema.

Anjan Kant
fonte
0

Encontrei o mesmo problema ao usar uma classe COM, ou seja, 'Classe não registrada exceção' em tempo de execução. Para mim, consegui resolver acessando o arquivo app.config e alterando os elementos 'startup' e 'supportedRuntime' para algo como:

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

Você pode ler mais sobre os detalhes aqui http://stackoverflow.com/questions/1604663/

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

Devo observar que estou executando o Visual Studio 2017. Target cpu = x86 Embed Interop Type = true (na janela de propriedades)

Joseph Mawer
fonte
0

vá para o diretório do .Net framework e registre sua respectiva dll com o caminho de dll de espaço em branco Regsvr32.exe .

Muhammad Saeed
fonte
0

Eu enfrentei o mesmo problema. Depois de fazer algumas pesquisas, encontrei uma solução para mim e pode ser útil. O problema não está apenas relacionado com a reinstalação, pelo que vi, depende também das permissões de acesso.

Etapa 1: Repare o objeto COM específico.

Etapa 2: Serviços de componentes> Computadores> Meu computador> Configuração DCOM> Selecione seu objeto COM> Clique com o botão direito> Propriedades> guia Segurança> Permissões de acesso> Escolha Personalizar> Clique em EDITAR> Selecione IIS_USER (se não existir, crie com direitos completos) e forneça completo acesse e clique em OK.

Mover para a guia Identidade> Você pode selecionar "Usuário interativo" ou "Este usuário"> Clique em Aplicar e OK. Se você escolher "Este usuário", temos que fornecer um usuário administrativo com privilégios para esse servidor

Etapa 3: Abra o Gerenciador do IIS> Reinicie os pools de aplicativos.

Nota: Se necessário, reinicie o servidor

Pavan Kumar Vempati
fonte
-1

Encontre aqui a solução, execute a ferramenta mmc -32 (não dcomcfg)

Em sistemas de 64 bits com Office de 32 bits, tente o seguinte:

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

insira a descrição da imagem aqui

Martín Martínez
fonte