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

StackOverflow https://stackoverflow.com/questions/1036856

Вопрос

Я разработал службу 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, вот еще один потенциальный обходной путь:

<Ол>
  • Найдите GUID вашего COM-объекта в HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  • После обнаружения добавьте новое значение REG_SZ (string). Имя должно быть AppID, а данные должны совпадать с GUID COM-объекта, который вы только что искали
  • Добавьте новый ключ в HKey_Classes_Root \ Wow6432Node \ AppID. Новый ключ должен называться так же, как GUID COM-объекта.
  • Под новым ключом, который вы только что добавили, добавьте новое строковое значение и назовите его DllSurrogate. Оставьте значение пустым.
  • Создайте новый ключ в HKey_Local_Machine \ Software \ Classes \ AppID \ Снова новый ключ должен называться так же, как COM-объект & # 8217; s GUID. В этом ключе нет необходимости добавлять значения.
  • Я не берусь за решение, но оно сработало для нас. Проверьте ссылку на источник для получения дополнительной информации и других комментариев.

    Источник: 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:

    <Ол>
  • откройте cmd.exe с правами администратора.
  • Скопируйте dll в папку C: \ Windows \ SysWOW64
  • запустить regsvr32 из C: \ Windows \ SysWOW64
  • Убедитесь, что dll находится в реестре Windows.
  • Если у вас есть .exe x86, который использует dll, exe должен быть скомпилирован в режиме x86.
  • Исполняемый файл должен быть установлен в папку C: \ Program Files (x86)
  • Эта процедура действительна, она в порядке.

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

    У меня для проекта службы 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:

    1. Создайте проект настройки для вашего решения.
    2. После того как вы создадите его, перейдите в Обозреватель решений и щелкните правой кнопкой мыши проект установки.
      • Нажмите кнопку 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, затем он работает.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top