Получение фабрики COM-класса для компонента с CLSID {XXXX} не удалось из-за следующей ошибки:80040154
-
10-07-2019 - |
Вопрос
Я разработал службу Windows, используя C#.NET для создания отчета в формате PDF.Для создания PDF-файла я использую стороннюю библиотеку DLL.Приложение запущено на моей платформе Windows XP.Когда я развернул сервис в Windows Server 2008 64-битная версия, я получил эту ошибку:
Получение фабрики COM-класса для компонента с CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} сбой произошел из-за следующей ошибки:80040154.
Я зарегистрировал библиотеку DLL с помощью команды regsvr32.Я могу увидеть этот CLSID в реестре.Но проблема сохраняется.
В чем может быть проблема?
Решение
В VS - свойства проекта - на вкладке "Сборка" - цель платформы = X86
Другие советы
Похоже, что ваша служба была построена на «любом процессоре», что приводит к ошибкам в 64-битной среде, где вы используете компоненты COM. Вам нужно построить его для x86
.
Сайт, вероятно, работает как 32-битный процесс, поэтому он может использовать компонент. Построение вашего решения на основе <=> заставит ваш сервис работать как 32-битный.
Я столкнулся с очень похожей проблемой.
Мне нужно было использовать старую 32-битную DLL в веб-приложении, которое разрабатывалось на 64-битной машине. Я зарегистрировал 32-битную DLL в папке windows \ sysWOW64, используя версию regsrv32 в этой папке.
Вызовы сторонней DLL работали из модульных тестов в Visual Studio, но не выполнялись веб-приложением, размещенным в IIS на том же компьютере, с ошибкой 80040154.
Изменение пула приложений на " Включить 32-битные приложения " решил проблему.
Вам не нужно настраивать свойства вашего проекта для целевой платформы X86.Вы также можете настроить параметры iis для работы с x86 подобным образом
- Выберите пул приложений
- Выберите пул, который использует ваше приложение
- Дополнительные настройки
- Включить 32-разрядные приложения верно
Если вы ищете способ заставить эту работу работать без перекомпиляции приложения Any CPU, вот еще один потенциальный обходной путь:
<Ол>Я не берусь за решение, но оно сработало для нас. Проверьте ссылку на источник для получения дополнительной информации и других комментариев.
Источник: https://techtalk.gfi.com/32bit-object- 64bit-среда /
Проблема в том, что серверный процесс является 64-разрядным, а библиотека - 32-разрядной, и она пытается создать компонент COM в том же процессе (сервер in-proc). Либо вы перекомпилируете сервер и сделаете его 32-битным, либо оставите сервер без изменений и отключите COM-компонент. Самый простой способ сделать COM-сервер вне процесса - это создать приложение COM + - Панель управления - & Gt; Администрирование - & Gt; ComponentServices.
Я не изменил никаких настроек компиляции.
Просто установите " Включить 32-битное приложение = True " в расширенных настройках AppPool.
Это сработало для меня
Решение для Windows 2008 Server x64:
<Ол>Эта процедура действительна, она в порядке. Р>
Возникла связанная проблема с другим, но похожим исправлением:
У меня для проекта службы Windows установлено значение " Any-CPU " используя 64-битную DLL. То же сообщение об ошибке. Перепробовал кучу всего, но ничего не получалось. Наконец, я вошел в свойства проекта - & Gt; Построить и заметил, что у проекта было & Quot; Предпочитать 32-битный & Quot; проверено. Снимите этот флажок и больше ошибок нет. Р>
Я предполагаю, что служба Windows ожидала 32-разрядную DLL и не смогла найти ее. Р>
У меня была такая же проблема, но другие ответы давали только одну часть решения.
Решение состоит из двух частей:
Удалите 64-битную версию из Реестра.
- c:\windows\system32 egsvr32.exe /U
- Это не приведет к удалению ссылок на другие скопированные библиотеки dll в других папках.
или
- Найдите ключ с именем HKEY_CLASSES_ROOT\\CLSID{......}\InprocServer32.Этот ключ будет иметь имя файла библиотеки DLL в качестве значения по умолчанию.
- Я удалил папку HKEY_CLASSES_ROOT\CLSID{.......}.
Зарегистрируйте его как 32-битный:
C:\Windows\SysWOW64\regsvr32 <file.dll>
Регистрация его как 32-битного без удаления 64-битной регистрации не решает мою проблему.
Чтобы перейти на x86:
- Создайте проект настройки для вашего решения.
- После того как вы создадите его, перейдите в Обозреватель решений и щелкните правой кнопкой мыши проект установки.
- Нажмите кнопку Configuration Manager.
- Нажмите на:В выпадающем списке "Платформа активного решения" выберите Создать (если не отображается x86).
- Выберите из первой комбинации x86, затем нажмите OK.
- перестройте установочный проект, затем перестройте весь проект.
Если вы работаете с веб-сайтом, вы также можете попытаться настроить пул приложений на отключение 32-разрядных приложений (в дополнительных настройках пула).
Для всех, кто использовал VSTO, проблемой для меня было отсутствие ссылки на office
сборку. Это также может появиться, если вы пытаетесь создать экземпляр определенных объектов VSTO вручную.
В моем личном случае проблема была исправлена при поиске идентификатора класса в реестре Windows на компьютере разработчика (поскольку проблема была вызвана на клиентском компьютере).Это действие будет помещено в COM-компонент, вызывающий проблему: библиотека x86, на которую ссылается мой проект .NET, которая не была зарегистрирована как OCX / COM для программы установки или обновления.
С уважением
Моя проблема заключалась в том, что в моем проекте использовалась неправильная версия MS Sync FrameWork (1.0). После обновления до версии 2.1 ошибка исчезла, и жизнь снова наладилась.
Я обнаружил, что моя проблема связана с фактической регистрацией DLL.
Первый запуск " Regedit.exe " из командной строки CMD (я поднял уровень безопасности до администратора, " на всякий случай "), затем выполните поиск в реестре (нажав " Edit / Find " в RegEdit меню или нажав Ctrl + F) для CLSID, показанного в сообщении об ошибке, которое вы получили относительно фабрики класса COM. Мой CLSID был 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Когда этот ключ найден, выберите вложенный ключ " InProcServer2 " под этим узлом Hive и выясните имя файла проблемы DLL в правой части окна Regedit. отображается под " По умолчанию " , Если этот файл находится в & Quot; C: \ Windows \ SysWow64 & Quot; (например, C: \ Windows \ SysWow64 \ Redemption.dll & Quot;) тогда важно использовать " C: \ Windows \ SysWow64 \ RegSvr32.exe " файл для регистрации этой DLL из командной строки, а НЕ по умолчанию " C: \ Windows \ System32 \ RegSvr32.exe " файл. Поэтому я запустил приглашение CMD (под управлением административного уровня (на случай, если этот уровень необходим)) и набрал в командной строке (в случае моей DLL): C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll нажмите клавишу ввода. Закройте командное окно (через & Quot; Выход & Quot; затем Перезагрузите компьютер (всегда используйте перезагрузку вместо Close Down, а затем запускайтесь, так как (как ни странно) Restart выполняет полное выключение и перезагрузите все, тогда как " Shut Down " и Power-Up перезагрузит сохраненный кэш драйверов и других значений (которые могут быть неисправны). Всякий раз, когда вы регистрируете DLL в будущем, не забудьте использовать SysWow64 & Quot; RegSvr32.exe & Quot; для любой библиотеки DLL, хранящейся в папке C: \ Windows \ SysWow64, и эта проблема c (если она вызвана неправильной регистрацией) не должна повториться.
В моем случае я создаю файл MS Office, например word
или excel
, я запускаю Win+R
и выполняю dcomcnfg
в конфигурации DCOM, а также выбираю элемент имени, связанный с 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
, затем он работает. р>