Когда я пытаюсь создать экземпляр класса COM, он генерирует исключение как
Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Пожалуйста, предложите, как я могу его решить?
Когда я пытаюсь создать экземпляр класса COM, он генерирует исключение как
Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Пожалуйста, предложите, как я могу его решить?
Похоже, какая бы программа или процесс, который вы пытаетесь инициализировать, не установлена на вашем компьютере, имеет поврежденную установку или должна быть зарегистрирована.
Либо установите его, либо восстановите (через "Установка и удаление программ" ), либо зарегистрируйте его (через Regsvr32.exe).
Вы не предоставили достаточно информации для нас, чтобы помочь вам больше, чем это.
Вам нужно убедиться, что все сборки собраны для правильной архитектуры. Попробуйте изменить архитектуру для x86, если переустановка COM-компонента не работает.
Моя проблема и решение
У меня есть 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 для правильного приложения.
Также обратите внимание, что контекст класса при инициализации может создать это исключение. Если у вас есть объект, который закодирован как INPROC_SERVER, но вы пытаетесь использовать CoCreateInstance как CLSCTX_LOCAL_SERVER, вы также получите эту ошибку.
Вам необходимо убедиться, что объект зарегистрирован, а CoCreateInstance создает экземпляр с правильным контекстом класса.
Если вы используете 64-битные COM-компоненты в веб-приложении в IIS, убедитесь, что пул приложений настроен так, чтобы не разрешать 32-разрядные приложения (Включить 32-разрядные приложения: false в дополнительных настройках)
Я получил его для работы, включив 32-битные приложения в дополнительных настройках пула приложений. Щелкните правой кнопкой мыши пул приложений и выберите дополнительные параметры - включите 32-разрядные приложения. Это может помочь кому-то там.
Регистрируя класс (в частности, его CLSID) - см., например, здесь.
в моем случае
my platform
- x64
the Dll library(sdk)
, а redistributable package
- x64
так
в проводнике решений navigate to your project
открыть Properties
change the Platform target from AnyCPU to x64
Я решил эту проблему: зарегистрировать COM
через regsvr32
.
убедитесь, что COM, который вы вызываете, зарегистрирован.
Мое приложение использовало xceedcry.dll
, и я не регистрировал его. Как только я зарегистрировал его, приложение отлично работало.
Для меня мне пришлось создать конфигурацию 64-битной сборки.
У меня была такая же проблема с использованием MapWinGis. Я нашел решение, работая над visual studio 2015 windows forms proyect, просто щелкнув правой кнопкой мыши на proyect- > properties- > Build, настройте конфигурацию для всех конфигураций и в целевой платформе conbobox, установите ее на x64.
Я столкнулся с этой проблемой, вызвав сборку .Net с клиента С++ через COM. Оказывается, что одна из сборок, на которую зависела сборка .Net, не может быть найдена. Некоторое время я боролся, пытаясь понять, что было не так с 1-й сборкой, но на самом деле это была одна из 1-го зависимостей сборки. При вызове CoCreateInstance() из клиента С++ я получил две разные ошибки. Первый: REGDB_E_CLASSNOTREG Класс не зарегистрирован И вторая попытка: 0x80131040: Расположенное определение манифеста сборки не соответствует ссылке на сборку.
Поэтому проверьте наличие ссылок на сборку. Я обнаружил это, просмотрев 1-ю сборку с помощью dotPeek и заметив, что одна из ее ссылок отсутствует. Размещение правильной версии зависимостей в папке разрешило обе ошибки.
Я компилировал мое приложение для таргетинга любого CPU, и основная проблема оказалась в том, что Adobe Reader был установлен старше v10.x должен обновить v11.x, вот как я могу решить эту проблему.
Моим решением было изменить " Включить 32-разрядные приложения" на True в расширенных настройках относительного пула приложений в IIS.
Я столкнулся с той же проблемой, используя класс 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 (в окне свойств)
В моем случае класс был зарегистрирован правильно и построен в режиме ЛЮБОЙ ЦП /64 бит.
Но для свойства Включить 32-разрядные приложения пула приложений IIS > для приложения, использующего класс, установлено значение Истина.
Класс не найден из-за несоответствия архитектуры между конфигурацией пула приложений и фактическим зарегистрированным классом.
Настройка Включить 32-разрядные приложения - False устранила проблему.
перейдите в каталог .Net framework и зарегистрируйте соответствующую dll с Regsvr32.exe пробелом dll.
Я столкнулся с той же проблемой. После некоторого исследования я нашел исправление для меня, и это может быть полезно. По моим наблюдениям, проблема связана не только с переустановкой, но и с правами доступа.
Шаг 1: Ремонт конкретного COM-объекта.
Шаг 2. Службы компонентов> Компьютеры> Мой компьютер> Конфигурация DCOM> Выберите COM-объект> Щелкните правой кнопкой мыши> Свойства> вкладка "Безопасность"> Права доступа> Выберите "Настройка"> "Изменить"> "Выбрать IIS_USER" (если не существует, создайте с полными правами) и дайте полный доступ и нажмите ОК.
Перейдите на вкладку "Личность"> Вы можете выбрать "Интерактивный пользователь" или "Этот пользователь"> Нажмите "Применить" и OK. Если вы выберете "Этот пользователь", мы должны предоставить привилегированного пользователя с правами администратора этому серверу.
Шаг 3. Откройте диспетчер IIS> Перезапустите пулы приложений.
Примечание: при необходимости перезагрузите сервер
Я решил это, не меняя цель сборки на "x86". Решение в ссылке: fooobar.com/questions/690706/...
Здесь найдите решение, запустите инструмент 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