Класс не зарегистрирован Ошибка

Запуск приложения из Visual Studio 2012 на 64-разрядных компьютерах отображает следующее сообщение об ошибке:

Извлечение COM-класса factory для компонента с CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B} завершилось ошибкой из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Я использую библиотеку Inventor packandgo dll в visualstudio.

Кто-нибудь знает, что такое ошибка?

Ответ 1

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

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

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

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

  • Теперь Ii использовал 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 для правильного приложения.

Ответ 2

Проблема в том, что DLL зарегистрирована в 32-битной версии реестра Windows, и приложение использует 64-разрядную версию.

Решение. Перейдите на вкладку "Свойства проекта", "Компилировать" и нажмите "Дополнительные параметры компиляции...". Измените "Целевой ЦП" на x86, нажмите "ОК", сохраните и повторите попытку.

Источник: http://www.theogray.com/blog/2009/10/comexception-regdbeclassnotreg-on-64-bit-windows

Работал для меня с VB 6 COM DLL, вызванным из приложения .NET Net Winforms

Ответ 3

Где-то в коде, который вы используете, есть вызов API Win32, CoCreateInstance, чтобы динамически загружать DLL и создавать экземпляр объекта от него.

Отображение между идентификатором компонента и DLL, способным создавать экземпляр этого объекта, обычно находится в HEKY_CLASSES_ROOT\CLSID в реестре. Обсудить это дальше было бы объяснить много о COM в Windows. Но ошибка указывает на то, что руководство COM отсутствует в реестре.

Я не очень понимаю, что такое PackAndGo DLL (компонент Autodesk), но я подозреваю, что вам просто нужно "установить" этот компонент или пакет программного обеспечения, с которым он пришел, через назначенный установщик, чтобы иметь эту DLL и соответствующий COM ключи реестра на вашем компьютере, на которых вы пытаетесь запустить свой код. (т.е. запустите setup.exe для этого продукта).

Другими словами, я думаю, вам нужно установить "Pack and Go" на этом компьютере, а не просто копировать DLL на целевую машину.

Кроме того, убедитесь, что вы решили создать свой код, подходящий как 32-разрядный или 64-разрядный, в зависимости от того, какой компоновщик компоновки (32 или 64 бит) пакета Pack And Go вы устанавливаете.

Ответ 4

В 64-битных машинах Windows компоненты COM должны регистрироваться в HKEY_CLASSES_ROOT\CLSID (64-битный компонент) ИЛИ HKEY_CLASSES_ROOT\Wow6432Node\CLSID (32-разрядный компонент). Если ваше приложение представляет собой 32-разрядное приложение, работающее на 64-разрядной машине, COM-библиотека обычно ищет GUID под Wow64 node, и если ваше приложение является 64-битным приложением, COM-библиотека будет пытаться загрузить из HKEY_CLASSES_ROOT\CLSID. Убедитесь, что вы настроили таргетинг на правильную платформу и убедитесь, что вы установили правильную версию библиотеки (32/64 бит).

Ответ 5

Долго решился, я уверен, но это может помочь другой плохой душе.

Эта ошибка может возникнуть, если DLL, которую вы развертываете в установочном пакете, не совпадает с DLL, на которую вы ссылаетесь (у них будут разные идентификаторы)

Звучит очевидно, но может легко произойти, если вы внесете небольшое изменение в dll и ранее установили приложение на своей собственной машине, которая перерегистрирует dll.

Ответ 6

У меня была эта проблема, и я решил ее, когда понял, что ищет реестр Windows, указанный в скобках.

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

Ответ 7

Я получил ошибку ниже в моем 32-разрядном приложении.

Ошибка: получение фабрики классов COM для компонента с CLSID {4911BB26-11EE-4182-B66C-64DF2FA6502D} не удалось из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

И на установку " Enable32bitApplications " на true в defaultapplicationpool в IIS работал для меня.

Ответ 8

У меня такая же проблема. Я пробовал много способов, но в конце концов решение было простым. Решение. Откройте IIS. В пуле приложений щелкните правой кнопкой мыши используемую платформу .net. Перейдите в настройки и измените "Включить 32-битные приложения" на "Истина".

Ответ 9

Я столкнулся с той же проблемой. Я добавил ссылку на dll COM-компонента Microsoft.Office.Interop.Excel, но Office не был установлен в моей системе, это не даст ошибку времени компиляции. Я переместил свое приложение в другую систему и запустил его.. оно успешно работало.

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