Как решить класс исключения COM Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?

Когда я пытаюсь создать экземпляр класса COM, он генерирует исключение как

Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Пожалуйста, предложите, как я могу его решить?

Ответ 1

Похоже, какая бы программа или процесс, который вы пытаетесь инициализировать, не установлена ​​на вашем компьютере, имеет поврежденную установку или должна быть зарегистрирована.

Либо установите его, либо восстановите (через "Установка и удаление программ" ), либо зарегистрируйте его (через Regsvr32.exe).

Вы не предоставили достаточно информации для нас, чтобы помочь вам больше, чем это.

Ответ 2

Вам нужно убедиться, что все сборки собраны для правильной архитектуры. Попробуйте изменить архитектуру для x86, если переустановка COM-компонента не работает.

Ответ 3

Моя проблема и решение

У меня есть 32-разрядная сторонняя dll, которую я установил в машине R2 R2 с 64-разрядной версией.

У меня есть служба wcf, созданная в .net 4.5 framework, которая вызывает 32-битную стороннюю DLL для процесса. Теперь у меня есть свойство build, настроенное на "любой" процессор и развернутое на 64-битной машине.

когда я попытался вызвать вызванную службу wcf-сервиса "80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

Теперь я использовал ProcMon.exe для отслеживания проблемы реестра com и определил, что процесс ищет запись реестра в HKLM\CLSID и HKCR\CLSID, где нет записи.

Пришло время узнать, что Microsoft не будет регистрировать 32-битные ком-компоненты на пути HKLM\CLSID, HKCR\CLSID на 64-битной машине, а помещает запись в пути HKLM\Wow6432Node\CLSID и HKCR\Wow6432Node\CLSID.

Теперь конфликт - это 64-битный процесс, который пытается вызвать 32-битный процесс на 64-битной машине, который будет искать запись реестра в HKLM\CLSID, HKCR\CLSID. Решение состоит в том, что нам нужно заставить 64-битный процесс посмотреть запись реестра в HKLM\Wow6432Node\CLSID и HKCR\Wow6432Node\CLSID.

Это может быть достигнуто путем настройки свойств проекта службы wcf для установки на "X86" вместо "Any".

После развертывания версии "X86" на сервере 2008 R2 возникла проблема "System.BadImageFormatException: Не удалось загрузить файл или сборку"

Решение этого badimageformatexception устанавливает для "Enable32bitApplications" значение "True" в свойствах IIS Apppool для правильного приложения.

Ответ 4

Также обратите внимание, что контекст класса при инициализации может создать это исключение. Если у вас есть объект, который закодирован как INPROC_SERVER, но вы пытаетесь использовать CoCreateInstance как CLSCTX_LOCAL_SERVER, вы также получите эту ошибку.

Вам необходимо убедиться, что объект зарегистрирован, а CoCreateInstance создает экземпляр с правильным контекстом класса.

Ответ 5

Если вы используете 64-битные COM-компоненты в веб-приложении в IIS, убедитесь, что пул приложений настроен так, чтобы не разрешать 32-разрядные приложения (Включить 32-разрядные приложения: false в дополнительных настройках)

Ответ 6

Я получил его для работы, включив 32-битные приложения в дополнительных настройках пула приложений. Щелкните правой кнопкой мыши пул приложений и выберите дополнительные параметры - включите 32-разрядные приложения. Это может помочь кому-то там.

Ответ 7

Регистрируя класс (в частности, его CLSID) - см., например, здесь.

Ответ 8

в моем случае

my platform - x64

the Dll library(sdk), а redistributable package - x64

так

  • в проводнике решений navigate to your project

  • открыть Properties

  • change the Platform target from AnyCPU to x64

введите описание изображения здесь

Ответ 9

Я решил эту проблему: зарегистрировать COM через regsvr32.

убедитесь, что COM, который вы вызываете, зарегистрирован.

Мое приложение использовало xceedcry.dll, и я не регистрировал его. Как только я зарегистрировал его, приложение отлично работало.

Ответ 10

Для меня мне пришлось создать конфигурацию 64-битной сборки.

Ответ 11

У меня была такая же проблема с использованием MapWinGis. Я нашел решение, работая над visual studio 2015 windows forms proyect, просто щелкнув правой кнопкой мыши на proyect- > properties- > Build, настройте конфигурацию для всех конфигураций и в целевой платформе conbobox, установите ее на x64.

Ответ 12

Я столкнулся с этой проблемой, вызвав сборку .Net с клиента С++ через COM. Оказывается, что одна из сборок, на которую зависела сборка .Net, не может быть найдена. Некоторое время я боролся, пытаясь понять, что было не так с 1-й сборкой, но на самом деле это была одна из 1-го зависимостей сборки. При вызове CoCreateInstance() из клиента С++ я получил две разные ошибки. Первый: REGDB_E_CLASSNOTREG Класс не зарегистрирован И вторая попытка: 0x80131040: Расположенное определение манифеста сборки не соответствует ссылке на сборку.

Поэтому проверьте наличие ссылок на сборку. Я обнаружил это, просмотрев 1-ю сборку с помощью dotPeek и заметив, что одна из ее ссылок отсутствует. Размещение правильной версии зависимостей в папке разрешило обе ошибки.

Ответ 13

Я компилировал мое приложение для таргетинга любого CPU, и основная проблема оказалась в том, что Adobe Reader был установлен старше v10.x должен обновить v11.x, вот как я могу решить эту проблему.

Ответ 14

Моим решением было изменить " Включить 32-разрядные приложения" на True в расширенных настройках относительного пула приложений в IIS.

Пул приложений

Включить 32-разрядные приложения

Ответ 15

Я столкнулся с той же проблемой, используя класс COM, т.е. "Не зарегистрированное исключение класса" во время выполнения. Для меня я смог решить, перейдя в файл app.config и изменив элементы "startup" и "supportedRuntime" на что-то вроде:

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

Подробнее вы можете узнать здесь http://stackoverflow.com/questions/1604663/

и здесь https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

Я должен отметить, что я запускаю Visual Studio 2017. Target cpu = x86 Вставить Interop Type = true (в окне свойств)

Ответ 16

В моем случае класс был зарегистрирован правильно и построен в режиме ЛЮБОЙ ЦП /64 бит.

Но для свойства Включить 32-разрядные приложения пула приложений IIS > для приложения, использующего класс, установлено значение Истина.

Класс не найден из-за несоответствия архитектуры между конфигурацией пула приложений и фактическим зарегистрированным классом.

Настройка Включить 32-разрядные приложения - False устранила проблему. Настройки пула приложений IIS

Ответ 17

перейдите в каталог .Net framework и зарегистрируйте соответствующую dll с Regsvr32.exe пробелом dll.

Ответ 18

Я столкнулся с той же проблемой. После некоторого исследования я нашел исправление для меня, и это может быть полезно. По моим наблюдениям, проблема связана не только с переустановкой, но и с правами доступа.

Шаг 1: Ремонт конкретного COM-объекта.

Шаг 2. Службы компонентов> Компьютеры> Мой компьютер> Конфигурация DCOM> Выберите COM-объект> Щелкните правой кнопкой мыши> Свойства> вкладка "Безопасность"> Права доступа> Выберите "Настройка"> "Изменить"> "Выбрать IIS_USER" (если не существует, создайте с полными правами) и дайте полный доступ и нажмите ОК.

Перейдите на вкладку "Личность"> Вы можете выбрать "Интерактивный пользователь" или "Этот пользователь"> Нажмите "Применить" и OK. Если вы выберете "Этот пользователь", мы должны предоставить привилегированного пользователя с правами администратора этому серверу.

Шаг 3. Откройте диспетчер IIS> Перезапустите пулы приложений.

Примечание: при необходимости перезагрузите сервер

Ответ 20

Здесь найдите решение, запустите инструмент mmc -32 (а не dcomcfg)

В 64-битной системе с 32-разрядным Office попробуйте следующее:

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

enter image description here