Как исправить ошибку COMException 80040154?

Перемещение рабочего проекта C # с 64-битной машины Windows 7 на 32-битную машину XP вызвало следующую ошибку:

Получение фабрики COM-classа для компонента с CLSID {681EF637-F129-4AE9-94BB-618937E3F6B6} завершилось ошибкой из-за следующей ошибки: 80040154.

681EF637-F129-4AE9-94BB-618937E3F6B6 не входит в реестр, поэтому он не установлен правильно, но это тот же идентификатор, который ранее был проблемой на 64-битной машине Windows 7. Решение этой ошибки на 64-битной машине Windows 7 было найдено здесь (изменение Platform Target на x86), но это не решает проблему на 32-битной машине XP. Как найти DLL, связанную с 681EF637-F129-4AE9-94BB-618937E3F6B6, или, что еще лучше, как восстановить это исключение?

Чтобы найти DLL, перейдите на свою 64-битную машину и откройте реестр. Найдите ключ HKEY_CLASSES_ROOT\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32 . Этот ключ будет иметь имя DLL в качестве значения по умолчанию.

Если вы решили проблему на своей 64-битной машине, перекомпилировав проект на x86, вам нужно будет посмотреть в 32-битной части реестра, а не в обычном месте. Это HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32 .

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

Когда у вас есть DLL, зарегистрируйте его, запустив c: \ windows \ system32 \ regsvr32.exe.

У меня была такая же проблема в службе Windows. Все ключи, где в нужном месте в реестре. Построение службы было выполнено для x86, и я все еще получил исключение. Я узнал о CorFlags.exe

Запустите это на вашем service.exe без флагов, чтобы проверить, выполняется ли вы до 32 бит. Если он не запускается с флагом /32BIT+ /Force (только для подписанных сборок)

Если у вас установлен UAC, вы можете получить следующую ошибку: corflags : error CF001 : Could not open file for writing Дайте пользователю полный контроль над assemblyми.

Консольный выход

Временное решение:

Возможное обходное решение – изменить платформу вашего проекта от «Любой процессор» до «X86» (в свойствах проекта, для сборки / платформы)

ОСНОВНАЯ ПРИЧИНА

VSS Interop – это управляемая assembly с использованием 32-разрядной Framework, а dll – 32-битный COM-объект. Если вы запустите эту COM-библиотеку в 64-разрядной среде, вы получите сообщение об ошибке.

Перемещайте переменные excel, которые глобально объявляют в вашей форме локальным, как в моей форме:

 Dim xls As New MyExcel.Interop.Application Dim xlb As MyExcel.Interop.Workbook 

над двумя строками были объявлены глобальными в моей форме, поэтому я переместил эти две строки в локальную функцию, и теперь инструмент работает нормально.

  • Исключение Java ArrayIndexOutOfBounds
  • Почему Catch (Exception) почти всегда является плохой идеей?
  • Как использовать try catch для обработки исключений - лучшая практика
  • В Java, когда я должен создать проверенное исключение и когда это должно быть исключение во время выполнения?
  • Рекомендации по распространению исключений (на Java)
  • Что означает «фатальная ошибка: неожиданно найденная нуль при разворачивании необязательного значения»?
  • C # - получить номер строки, в которой было исключение
  • Можно ли исключить исключение из памяти в java?
  • Oracle PL / SQL - повышение пользовательского исключения с помощью пользовательского SQLERRM
  • Каким образом исключения C ++ замедляют работу кода, если нет исключений?
  • Как создать пользовательские исключения в Java?
  • Давайте будем гением компьютера.