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

278

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

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

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

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

Гопал
источник
1
Веб-приложение, размещенное на том же сервере, может генерировать PDF-файл без каких-либо ошибок.
гопал
Ребята, я попробовал все возможные решения, но все еще получаю эту ошибку. У меня есть сборки и я их успешно зарегистрировал, но все равно получаю ту же ошибку. Действительно нужна помощь ...
newprogress

Ответы:

383

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

Фабрис Марианадин
источник
7
в VS2008 я нашел эту опцию в «Compile-> Advanced Compile Options ...» (внизу вкладки окна), а затем «Target CPU» (x86)
Rodolfo
1
Вы заслуживаете больше, чем +1, но +1 - это все, что я должен дать
Дэвид
7
Это не всегда решение.
2
Вы спасли мне семь оффшорных банковских счетов, стойку для хот-догов и мой брак. Спасибо
Donald.Record
2
У меня такое же сообщение об ошибке, но это решение не работает для меня.
Акрам Хан
59

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

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

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

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

Дэниел Баллинджер
источник
1
Это самый простой способ, который я нашел, чтобы решить эту проблему. Спасибо!
Декстер
6
Мне очень нравится этот ответ. Нет смысла компилировать весь сайт для x86, когда в какой-то момент вы вызываете только одну крошечную 32-битную DLL.
DanM7
@Daniel Ballinger Будет ли мое приложение работать при внесении изменений как 32-битный процесс?
Новичок
@ Дэнни Я не верю в это, так как он не сможет получить доступ к DLL, которую я зарегистрировал в sysWOW64.
Даниэль Баллинджер
1
У меня та же проблема, но я не знаю, как изменить пул приложений, где я должен это сделать,
пожалуйста
58

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

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

stevehipwell
источник
Я также сталкиваюсь с той же проблемой .. здесь мое настольное приложение успешно установлено в 64-битной системе .. во время установки я успешно выполнил синхронизацию, но когда я выполняю синхронизацию из моего программного обеспечения, это показывает мне ошибку выше
Mohini Mhetre
Я пытаюсь зарегистрироваться, .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)но получаю сообщение об ошибке Не удалось загрузить модуль. Убедитесь, что двоичный файл хранится по указанному пути, или отладьте его, чтобы проверить наличие проблем с двоичными или зависимыми файлами .DLL.
Навин Кумар
И если он скомпилирован как 32-битный, то следует использовать System regsvr32, а не версию SysWow64.
Fandango68
Я получаю эту ошибку при запуске пакета служб SSIS. Соединения работают нормально. Все свойства верны. На самом деле пакет SSIS работал много месяцев без каких-либо ошибок. Внезапно я получаю выше ошибки. Я попытался изменить время выполнения / отладку на x86 с x64, но проблема до сих пор не решена.
IamVISH
16

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

  • Выберите пул приложений
  • Выберите пул, который использует ваше приложение
  • Расширенные настройки
  • Включить 32 - разрядные приложения истинные
Назим Хатипоглу
источник
Это всегда было правдой для меня. Никогда не приходилось устанавливать целевую платформу для X86, но всегда • Включить 32-разрядные приложения = True • Установить Identity = ApplicationPoolIdentity • Загрузить профиль пользователя = True
Zath.
У меня была похожая проблема, которая была исправлена ​​в соответствии с инструкциями Назима, но мне также пришлось не «Вставлять типы взаимодействия» (свойство ссылочной библиотеки DLL) и установить Copy Local = true.
Киморг
Как вы «выберите пул приложений»?
CodyBugstein
Меню Пулы приложений находится в списке меню iis слева
nazim hatipoglu
16

Если вы ищете способ заставить эту работу работать без перекомпиляции приложения 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-объекта. Никакие значения не должны быть добавлены под этим ключом.

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

Источник: https://techtalk.gfi.com/32bit-object-64bit-environment/

Джошуа Старнер
источник
1
Самые прекрасные инструкции. Я использовал сторонний инструмент, и я не смог изменить платформу сборки. Это решение обошло эту проблему. Спасибо!
Я нашел ключ, как вы описали в шаге 1, и затем я знал, какой COM-объект создает проблемы, а затем я просто запустил на нем regsvr32. Большое спасибо!
MichaelS
Когда я сделал это, мой локальный веб-сервер (IIS) начал получать отказ в доступе. Это говорит мне, что это был шаг в правильном направлении, но я не уверен, кому дать доступ на данный момент. stackoverflow.com/questions/14019401/...
user420667
14

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

Sharptooth
источник
Я столкнулся с ошибкой при попытке создать приложение COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee
8

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

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

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

Эдуардо Ксавье
источник
1
Где находятся расширенные настройки AppPool?
CodyBugstein
7

Решение для 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)

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

Juan
источник
6

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

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

Удалите 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-битной регистрации не решает мою проблему.

Герхард Пауэлл
источник
Бинго! Это ответ, который я искал (см. Мои комментарии в другом месте). Спасибо!
Fandango68
5

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

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

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

jinushaun
источник
Хотя это странно, но это работает! Спасибо
FindOutIslamNow
3

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

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

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

scramblor
источник
2
У меня было наоборот и пришлось включить 32-битные приложения.
row1
2

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

С уважением

Цезарь Кюеб
источник
1

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

Alex
источник
1

Я обнаружил, что моя проблема связана с фактической регистрацией 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: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll нажмите клавишу ввода. Закройте командное окно (через «Выход», затем перезагрузите компьютер (всегда используйте перезагрузку вместо «Закрыть», а затем запустить, так как (как ни странно), «Перезагрузка» выполняет полное выключение и перезагрузку всего, тогда как «Завершение работы» и Power-Up перезагружают сохраненный кэш драйверов и других значений (которые могут быть неисправны). Всякий раз, когда вы регистрируете DLL в будущем, не забудьте использовать SysWow64 «RegSvr32.exe» для любой DLL, хранящейся в папке C: \ Windows \ SysWow64, и эта проблема c (если это вызвано неправильной регистрацией) не должно повториться.

Крис Изюм
источник
Отличный совет, но имейте в виду, что при регистрации 32-битной DLL в SysWow64 предполагается, что у DLL есть оболочка для обработки 64-битных запросов.
Fandango68
0

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

Phogrammer
источник
0

В моем случае я создаю 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, затем он работает.

ю ян цзянь
источник