Как исправить ошибку COMException 80040154?
Перемещение рабочего проекта С# с 64-разрядного компьютера с Windows 7 на 32-разрядный компьютер с XP вызвало следующую ошибку:
Retrieving the COM class factory for component with CLSID {681EF637-F129-4AE9-94BB-618937E3F6B6} failed due to the following error: 80040154.
681EF637-F129-4AE9-94BB-618937E3F6B6
отсутствует в реестре, поэтому он не установлен должным образом, но это тот же идентификатор, который ранее был проблемой на 64-разрядной машине с Windows 7.
Решение этой ошибки на 64-разрядной машине Windows 7 было найдено здесь (измените Цель платформы на x86), но это не решает проблему на 32-разрядной машине XP.
Как найти DLL, связанную с 681EF637-F129-4AE9-94BB-618937E3F6B6
, или, что еще лучше, как исправить это исключение?
Ответы
Ответ 1
Чтобы найти 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.
Ответ 2
У меня была такая же проблема в службе Windows. Все ключи, где в нужном месте в реестре. Построение службы было выполнено для x86, и я все еще получил исключение. Я узнал о CorFlags.exe
Запустите это на service.exe
без флагов, чтобы убедиться, что вы работаете под 32 бит. Если не запустить его с флагом /32BIT+ /Force
(Только для подписанных сборок)
Если у вас установлен UAC, вы можете получить следующую ошибку: corflags : error CF001 : Could not open file for writing
Предоставить пользователю полный контроль над сборками.
![Console output]()
Ответ 3
Временное решение:
Возможное обходное решение - изменить вашу платформу проекта от "Любой процессор" до "X86" (в свойствах проекта, цели сборки/платформы).
ROOTCAUSE
VSS Interop - это управляемая сборка с использованием 32-разрядной Framework, а dll - 32-разрядный COM-объект. Если вы запустите эту COM-библиотеку в 64-битной среде, вы получите сообщение об ошибке.
Ответ 4
Переместить переменные excel, которые глобально объявляют в вашей форме локальным, как в моей форме, я:
Dim xls As New MyExcel.Interop.Application
Dim xlb As MyExcel.Interop.Workbook
над двумя строками были объявлены глобальными в моей форме, поэтому я переместил эти две строки в локальную функцию, и теперь инструмент работает нормально.