Получение фабрики классов 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 в реестре. Но проблема остается.



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

2252   15  

15 ответов:

в свойствах VS-project-на вкладке Build-platform 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+ - Панель управления - > Администрирование - > ComponentServices.

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

  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-битные приложения правда

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

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

Это сработало для меня

решение для windows 2008 server x64:

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

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

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

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

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

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

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

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

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

или

  • найдите ключ с именем CMD\CLSID{......}\InprocServer32. Этот ключ будет иметь имя файла DLL в качестве значения по умолчанию.
  • Я удалил 【\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 ошибка исчезла, и жизнь снова хороша.

Comments

    Ничего не найдено.