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

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

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

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

4 ответов


чтобы найти 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 - ... исполняемый.


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

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

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

Console output


решение:

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

первопричины

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


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

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

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