Как решить класс исключения 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
так
![введите описание изображения здесь]()
Ответ 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> Перезапустите пулы приложений.
Примечание: при необходимости перезагрузите сервер
Ответ 19
Я решил это, не меняя цель сборки на "x86". Решение в ссылке: fooobar.com/questions/690706/...
Ответ 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]()