Не удалось получить фабрику класса COM для компонента с CLSID {XXXX} из-за следующей ошибки: 80040154

Я разработал службу Windows, используя C#.NET для создания отчета в формате PDF. Для создания PDF-файла я использую стороннюю DLL. Приложение работает на моей платформе Windows XP. Когда я развернул службу в 64-разрядной версии Windows Server 2008, я получил эту ошибку:

Не удалось получить фабрику класса COM для компонента с CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} из-за следующей ошибки: 80040154.

Я зарегистрировал DLL с помощью команды regsvr32. Я смог увидеть этот CLSID в реестре. Но проблема сохраняется.

В чем может быть проблема?

18 ответов

Решение

В VS - свойства проекта - во вкладке Build - target target =X86

Я столкнулся с очень похожей проблемой.

Мне нужно было использовать старую 32-битную DLL в веб-приложении, которое разрабатывалось на 64-битной машине. Я зарегистрировал 32-битную DLL в папке windows\sysWOW64, используя версию regsrv32 в этой папке.

Вызовы сторонней библиотеки DLL работали из модульных тестов в Visual Studio, но не выполнялись веб-приложением, размещенным в IIS на том же компьютере, с ошибкой 80040154.

Изменение пула приложений на "Включить 32-разрядные приложения" решило проблему.

Похоже, что ваш сервис был построен на "Любой процессор", вызывая ошибки на 64-битных, где вы используете компоненты COM. Вы должны построить это для x86,

Сайт, вероятно, работает как 32-битный процесс, поэтому он может использовать компонент. Создание вашего решения против x86 заставит ваш сервис работать как 32-битный.

Если вы ищете способ сделать это без перекомпиляции приложения Any CPU, вот еще один потенциальный обходной путь:

  1. Найдите свой GUID COM-объекта в HKey_Classes_Root\Wow6432Node\CLSID\{GUID}
  2. После определения местоположения добавьте новое значение REG_SZ (строка). Имя должно быть AppID, а данные должны совпадать с GUID COM-объекта, который вы только что искали
  3. Добавьте новый ключ в HKey_Classes_Root\Wow6432Node\AppID. Новый ключ должен называться так же, как GUID COM-объекта.
  4. Под новым ключом, который вы только что добавили, добавьте новое строковое значение и назовите его DllSurrogate. Оставьте значение пустым.
  5. Создайте новый ключ в HKey_Local_Machine \ Software \ Classes \ AppID \ И снова новый ключ должен называться так же, как GUID COM-объекта. Никаких значений не требуется добавлять под этим ключом.

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

Источник: http://www.gfi.com/blog/32bit-object-64bit-environment/

Вам не нужно настраивать целевой объект платформы свойств X86. Вы также можете настроить параметры iis для работы с x86 следующим образом.

  • Выберите пул приложений
  • Выберите пул, который использует ваше приложение
  • Расширенные настройки
  • Включить 32-битные приложения есть

Проблема заключается в том, что серверный процесс является 64-разрядным, а библиотека - 32-разрядной, и она пытается создать компонент COM в том же процессе (сервер in-proc). Либо вы перекомпилируете сервер и сделаете его 32-битным, либо оставите сервер без изменений и отключите COM-компонент. Самый простой способ сделать COM-сервер вне процесса - это создать приложение COM+ - Панель управления -> Администрирование -> ComponentServices.

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

Решение в два раза:

Удалите 64 бита из реестра.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Это не удалит ссылки на другие скопированные из dll в других папках.

или же

  • Найдите ключ с именем HKEY_CLASSES_ROOT\CLSID{......}\InprocServer32. Этот ключ будет иметь имя файла DLL в качестве значения по умолчанию.
  • Я удалил папку HKEY_CLASSES_ROOT \ CLSID {......}.

Зарегистрируйте это как 32 бита:

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

Регистрация в качестве 32-битной без удаления 64-битной регистрации не решает мою проблему.

Я не изменил никаких настроек компиляции.

Просто установите "Включить 32-битное приложение = True" в расширенных настройках AppPool.

У меня сработало

Решение для Windows 2008 Server x64:

  1. Откройте cmd.exe с правами администратора.
  2. Скопируйте dll в папку C:\Windows\SysWOW64
  3. запустить regsvr32 из C:\Windows\SysWOW64
  4. Убедитесь, что dll находится в реестре Windows.
  5. Если у вас есть.exe x86, который использует dll, exe должен быть скомпилирован в режиме x86.
  6. EXE должен быть установлен в папке C:\Program Files (x86)

Эта процедура действительна, это нормально.

Была связанная проблема с другим, но похожим исправлением:

У меня был установлен проект службы Windows "Any-CPU" с использованием 64-битной DLL. То же сообщение об ошибке. Перепробовал кучу всего, но ничего не получалось. Наконец, я вошел в Свойства проекта -> Построить и заметил, что в проекте отмечен флажок "Предпочитать 32-битный". Снимите этот флажок и больше ошибок нет.

Я предполагаю, что служба Windows ожидала 32-битную DLL и не смогла найти ее.

Чтобы перейти на x86:

  1. Создайте проект установки для вашего решения.
  2. После создания перейдите в Solution Explorer, щелкните правой кнопкой мыши проект установки.
    • Нажмите Диспетчер конфигурации.
    • Нажмите: со списком "Active Solution Platform" и выберите New (если не отображается x86)
    • Выберите первый комбо x86, затем нажмите OK.
    • перестройте проект установки, затем перестройте весь проект.

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

Я обнаружил, что моя проблема связана с фактической регистрацией DLL.

Сначала запустите "Regedit.exe" из командной строки CMD (я поднял уровень безопасности до администратора, "на всякий случай"), затем выполните поиск в реестре (нажав "Редактировать / Найти" в меню RegEdit или нажав Ctrl+F) для CLSID, показанного в сообщении об ошибке, которое вы получили относительно фабрики класса COM. Мой CLSID был 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Когда этот ключ найден, выберите вложенный ключ "InProcServer2" под этим узлом Hive и определите имя файла проблемной DLL в правом кадре Regedit. показывает под "По умолчанию". Если этот файл находится в "C:\Windows\SysWow64"(например, C:\Windows\SysWow64\Redemption.dll"), важно использовать файл"C:\Windows\SysWow64\RegSvr32.exe"для зарегистрируйте эту DLL из командной строки, а НЕ по умолчанию файл "C:\Windows\System32\RegSvr32.exe". Поэтому я запустил приглашение CMD (под контролем административного уровня (на всякий случай, если этот уровень требуется)) и введите командная строка (в случае моей DLL):C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll нажмите клавишу ввода. Закройте командное окно (через "Выход", затем перезагрузите компьютер (всегда используйте restart вместо Close Down, затем запустите, поскольку (как ни странно) Restart выполняет полное выключение и перезагрузку всего, тогда как "Shut Down" и Power-Up перезагружают сохраненный кэш драйверов и других значений (которые могут быть неисправны). Вы регистрируете DLL в будущем, не забудьте использовать SysWow64 "RegSvr32.exe" для любой DLL, хранящейся в папке C: \ Windows \ SysWow64, и эту проблему c(если она вызвана Правильная регистрация) не должно повториться.

В моем личном случае проблема была исправлена ​​при поиске идентификатора класса в реестре Windows на компьютере разработчика (поскольку проблема возникла на клиентском ПК). Это действие будет помещено в компонент COM, который вызывает проблему: библиотеку x86, на которую ссылается мой проект.NET, которая не была зарегистрирована как OCX/COM для программы установки или программы обновления.

С уважением

Принятый ответ, изменение целевой платформы на x86 может не сработать!

Когда я установил Crystal Report для Visual Studio, в моем случае заработал механизм выполнения Crystal Report (64-разрядная версия) !

Некоторые другие предполагают, что эту проблему можно решить, установив как 32-разрядную, так и 64-разрядную среду выполнения !

Вы можете попробовать!

Для тех, кто использует VSTO, проблемой для меня было отсутствие ссылки на office сборка. Это также может появиться, если вы пытаетесь создать экземпляр определенных объектов VSTO вручную.

Моя проблема заключалась в том, что в моем проекте использовалась неправильная версия MS Sync FrameWork (1.0). После обновления до версии 2.1 ошибка исчезла и жизнь снова наладилась.

В моем случае я создаю MS Office файл как word или же excel, Я бегу Win+R и выполнить dcomcnfgв DCOM Config, кроме того, выберите OFFICE связанный элемент имени (например, имя содержит Excel или же Word или же Office) а также Open the properties, select Identity tab and select the interactive user. как этот ответ,

Мое сообщение об ошибке показать CLSID {000209FF-0000-0000-C000-000000000046}, поэтому я должен попытаться найти этот конкретный CLSID в DCOM Config, и он действительно существует, и я выбираю его и следую за тем же шагом, установите interactive userтогда это работает.

Другие вопросы по тегам