Я разработал службу Windows, используя C # .NET для создания отчета в формате PDF. Для создания PDF-файла я использую стороннюю DLL. Приложение работает на моей платформе Windows XP. Когда я развернул службу в 64-разрядной версии Windows Server 2008 , я получил эту ошибку:
Не удалось получить фабрику класса COM для компонента с CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} из-за следующей ошибки: 80040154.
Я зарегистрировал DLL с помощью команды regsvr32. Я смог увидеть этот CLSID в реестре. Но проблема сохраняется.
В чем может быть проблема?
Ответы:
В VS - свойства проекта - во вкладке Build - target target = X86
источник
Я столкнулся с очень похожей проблемой.
Мне нужно было использовать старую 32-битную DLL в веб-приложении, которое разрабатывалось на 64-битной машине. Я зарегистрировал 32-битную DLL в папке windows \ sysWOW64, используя версию regsrv32 в этой папке.
Вызовы сторонней библиотеки DLL работали из модульных тестов в Visual Studio, но не выполнялись веб-приложением, размещенным в IIS на том же компьютере, с ошибкой 80040154.
Изменение пула приложений на «Включить 32-разрядные приложения» решило проблему.
источник
Похоже, что ваш сервис был построен на «Любой процессор», вызывая ошибки на 64-битных, где вы используете компоненты COM. Вы должны построить это для
x86
.Сайт, вероятно, работает как 32-битный процесс, поэтому он может использовать компонент. Создание вашего решения против
x86
заставит ваш сервис работать как 32-битный.источник
.ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)
но получаю сообщение об ошибке Не удалось загрузить модуль. Убедитесь, что двоичный файл хранится по указанному пути, или отладьте его, чтобы проверить наличие проблем с двоичными или зависимыми файлами .DLL.Вам не нужно настраивать целевой объект платформы свойств X86. Вы также можете настроить параметры iis для работы с x86 следующим образом.
источник
Если вы ищете способ заставить эту работу работать без перекомпиляции приложения Any CPU, вот еще один потенциальный обходной путь:
Я не принимаю кредит на решение, но оно сработало для нас. Проверьте ссылку на источник для получения дополнительной информации и других комментариев.
Источник: https://techtalk.gfi.com/32bit-object-64bit-environment/
источник
Проблема заключается в том, что серверный процесс является 64-разрядным, а библиотека - 32-разрядной, и она пытается создать компонент COM в том же процессе (сервер in-proc). Либо вы перекомпилируете сервер и сделаете его 32-битным, либо оставите сервер без изменений и отключите COM-компонент. Самый простой способ сделать COM-сервер вне процесса - это создать приложение COM + - Панель управления -> Администрирование -> ComponentServices.
источник
An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
Я не изменил никаких настроек компиляции.
Просто установите «Включить 32-битное приложение = True» в расширенных настройках AppPool.
У меня сработало
источник
Решение для Windows 2008 Server x64:
Эта процедура действительна, это нормально.
источник
У меня была та же проблема, но другие ответы предоставили только одну часть решения.
Решение в два раза:
Удалите 64 бита из реестра.
или
Зарегистрируйте это как 32 бита:
C:\Windows\SysWOW64\regsvr32 <file.dll>
Регистрация в качестве 32-битной без удаления 64-битной регистрации не решает мою проблему.
источник
Была связанная проблема с другим, но похожим исправлением:
У меня был установлен проект службы Windows «Any-CPU» с использованием 64-битной DLL. То же сообщение об ошибке. Перепробовал кучу всего, но ничего не получалось. Наконец, я вошел в Свойства проекта -> Построить и заметил, что в проекте отмечен флажок «Предпочитать 32-битный». Не проверено это и больше нет ошибки.
Я предполагаю, что служба Windows ожидала 32-битную DLL и не смогла найти ее.
источник
Чтобы перейти на x86:
источник
Если вы работаете на веб-сайте, вы также можете попытаться настроить пул приложений на отключение 32-разрядных приложений (в расширенных настройках пула).
источник
В моем личном случае проблема была исправлена при поиске идентификатора класса в реестре Windows на компьютере разработчика (поскольку проблема возникла на клиентском ПК). Это действие будет помещено в компонент COM, который вызывает проблему: библиотеку x86, на которую ссылается мой проект .NET, которая не была зарегистрирована как OCX / COM для программы установки или программы обновления.
С уважением
источник
Для любого, кто использует VSTO, проблемой для меня было отсутствие ссылки на
office
сборку. Это также может появиться, если вы пытаетесь создать экземпляр определенных объектов VSTO вручную.источник
Я обнаружил, что моя проблема связана с фактической регистрацией 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 (если это вызвано неправильной регистрацией) не должно повториться.
источник
Моя проблема заключалась в том, что в моем проекте использовалась неправильная версия MS Sync FrameWork (1.0). После обновления до версии 2.1 ошибка исчезла и жизнь снова наладилась.
источник
В моем случае я создаю 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
, затем он работает.источник