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

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

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

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

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

15 ответов


в VS-свойства проекта-на вкладке сборка - платформа target =X86


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

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


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

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

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

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


проблема в том, что серверный процесс 64-разрядный, а библиотека 32-разрядная, и он пытается создать com-компонент в том же процессе (in-proc server). Либо вы перекомпилируете сервер и сделаете его 32-разрядным, либо оставите сервер без изменений и выведете com-компонент из процесса. Самый простой способ сделать COM-сервер вне процесса-создать com+ application-Control Panel - > Administrative Tools - > ComponentServices.


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

  1. найдите свой идентификатор GUID COM-объекта в разделе HKey_Classes_Root\Wow6432Node\CLSID\{GUID}
  2. после размещения добавьте новое значение REG_SZ (string). Имя должно быть 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-разрядные приложения правда

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

просто установите "включить 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 файлы (x86)

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


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

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

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


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

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

удалите 64bit из Registery.

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

или

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

зарегистрируйте его как 32bit:

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

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


для перехода на x86:

  1. создайте проект установки для вашего решения.
  2. после его создания перейдите в Обозреватель решений, щелкните правой кнопкой мыши проект установки.
    • Нажмите Configuration Manager.
    • нажмите на:" Active Solution Platform " combobox и выберите Создать (если x86 не отображается)
    • выберите из первого комбинированного x86, затем нажмите OK.
    • перестроить проект установки, затем перестроить все проект.

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


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


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

в отношении


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