Можете ли вы дать более подробную информацию с помощью кода?
Xaisoft
10
Возникает два вопроса: 1. Вы установили / зарегистрировали COM-компонент на машине с Windows 7 x64? 2. Какая целевая платформа вашего приложения, я думаю, вам следует установить платформу x86, пожалуйста, не устанавливайте ее как «Любой процессор»? Пожалуйста, сначала зарегистрируйте COM, а затем запустите, чтобы протестировать приложение. См. Документ: support.microsoft.com/kb/146219 и Объяснение использования Regsvr32 и сообщений об ошибках
Похоже, какая бы программа или процесс вы ни пытались инициализировать, они либо не установлены на вашем компьютере, либо имеют поврежденную установку, либо их необходимо зарегистрировать.
Либо установите, либо отремонтируйте (с помощью «Установка и удаление программ»), либо зарегистрируйте (с помощью Regsvr32.exe).
Вы не предоставили нам достаточно информации, чтобы помочь вам, кроме этой.
Думаю, вы имели в виду RegSvr32.exe (в отличие от RegSrv32.exe).
windowsgm
60
Вам необходимо убедиться, что все ваши сборки компилируются для правильной архитектуры. Попробуйте изменить архитектуру для x86, если переустановка COM-компонента не работает.
Это решило, что мой процесс не нашел клиента NAV 2009 R2 (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Винсент Ванкалберг
14
Моя проблема и решение
У меня есть 32-битная сторонняя dll, которую я установил на машине 2008 R2, которая является 64-битной.
У меня есть служба wcf, созданная в платформе .net 4.5, которая вызывает 32-битную стороннюю dll для процесса. Теперь у меня есть свойство сборки, настроенное на «любой» процессор, и я развернул его на 64-битном компьютере.
при попытке вызвать службу wcf возникла ошибка «Класс 80040154 не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG»
Теперь я использовал ProcMon.exe, чтобы отследить проблему реестра com и определил, что процесс ищет записи реестра в HKLM \ CLSID и HKCR \ CLSID, где нет записи.
Стало известно, что Microsoft не будет регистрировать 32-битные компоненты com в пути HKLM \ CLSID, HKCR \ CLSID на 64-битной машине, а поместит запись в пути HKLM \ Wow6432Node \ CLSID и HKCR \ Wow6432Node \ CLSID.
Теперь конфликт заключается в том, что 64-битный процесс пытается вызвать 32-битный процесс на 64-битном компьютере, который будет искать запись в реестре в HKLM \ CLSID, HKCR \ CLSID. Решение состоит в том, что мы должны заставить 64-битный процесс смотреть записи реестра в HKLM \ Wow6432Node \ CLSID и HKCR \ Wow6432Node \ CLSID.
Это может быть достигнуто путем настройки свойств проекта службы wcf для целевой машины «X86» вместо «Any».
После развертывания версии «X86» на сервере 2008 R2 возникла проблема «System.BadImageFormatException: не удалось загрузить файл или сборку»
Решением этого badimageformatexception является установка для Enable32bitApplications значения True в свойствах пула приложений IIS для правильного пула приложений.
Пожалуйста, не публикуйте одинаковые ответы на несколько вопросов. Опубликуйте один хороший ответ, затем проголосуйте / отметьте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не повторяется, адаптируйте свои ответы к вопросу .
kleopatra 08
10
Также обратите внимание, что контекст класса при инициализации может создать это исключение. Если у вас есть объект, кодируемый как INPROC_SERVER, но вы пытаетесь использовать CoCreateInstance как CLSCTX_LOCAL_SERVER, вы также получите эту ошибку.
Вам необходимо убедиться, что объект зарегистрирован, и CoCreateInstance создает экземпляр с правильным контекстом класса.
Да, если, например, вы попытаетесь создать, DesktopWallpaperиспользуя CLSCTX_INPROC(вместо CLSCTX_ALL), вы получите 0x80040154 (REGDB_E_CLASSNOTREG)ошибку.
user362515 09
9
Если вы используете 64-разрядные компоненты COM в веб-приложении на IIS, убедитесь, что пул приложений не разрешает 32-разрядные приложения ( Включить 32-разрядные приложения: false в дополнительных настройках)
Я заставил его работать, включив 32-битные приложения в расширенных настройках пула приложений. Щелкните правой кнопкой мыши пул приложений и выберите дополнительные настройки - включите 32-разрядные приложения. Это может кому-то помочь.
Мне то же. 32-битная dll, используемая на 64-битной машине разработчика, 64-битном тестовом и 64-битном реальном сервере. Отлично работал на коробке разработчика. При развертывании на тестовом и действующем серверах он терпел неудачу, пока 32-битные приложения не были разрешены в соответствующих пулах приложений IIS и пулы не были перезапущены. Мне также пришлось отключить «Embed Interop Types» (параметр для вызывающей ошибку dll в VS) и установить «Copy Local» = true, чтобы убедиться, что dll действительно скопирована в исходной форме на серверы.
cymorg
3
Регистрируя класс (в частности, его CLSID) - см., Например, здесь .
Мое решение состояло в том, чтобы изменить « Включить 32-разрядные приложения » на «Истина» в дополнительных настройках относительного пула приложений в IIS.
У меня была такая же проблема с использованием MapWinGis. Я нашел решение, работая над проектом Windows Forms Visual Studio 2015, просто щелкните правой кнопкой мыши proyect-> properties-> Build, установите конфигурацию на All configurations, а в conbobox «target platform» установите его на x64.
Я столкнулся с этой проблемой при вызове сборки .Net от клиента C ++ через COM. Оказывается, не удалось найти одну из сборок, от которой зависела сборка .Net. Некоторое время я боролся, пытаясь понять, что не так с первой сборкой, но на самом деле это была одна из зависимостей первой сборки. Я получил две разные ошибки при вызове CoCreateInstance () из клиента C ++. Первый:
REGDB_E_CLASSNOTREG Класс не зарегистрирован.
Вторая попытка:
0x80131040: определение манифеста обнаруженной сборки не соответствует ссылке на сборку.
Поэтому убедитесь, что ссылки на вашу сборку присутствуют. Я обнаружил это, просмотрев первую сборку с помощью dotPeek и заметил, что одна из ссылок на нее отсутствует. Размещение правильной версии зависимости в папке устранило обе ошибки.
Я компилировал свое приложение, нацеленное на любой процессор, и основная проблема оказалась в том, что был установлен Adobe Reader, более старый v10.x необходимо обновить v11.x , вот как я могу решить эту проблему.
Я столкнулся с той же проблемой, используя класс COM, то есть «исключение класса не зарегистрировано» во время выполнения. Мне удалось решить эту проблему, перейдя в файл app.config и изменив элементы «startup» и «supportedRuntime» на что-то вроде:
Я столкнулся с той же проблемой. После некоторого исследования я нашел исправление для себя, и оно может оказаться полезным. По моим наблюдениям, проблема связана не только с переустановкой, она также зависит от прав доступа.
Шаг 1. Восстановите конкретный COM-объект.
Шаг 2: Службы компонентов> Компьютеры> Мой компьютер> Конфигурация DCOM> Выберите свой COM-объект> щелкните правой кнопкой мыши> Свойства> вкладка Безопасность> Разрешения доступа> Выберите Настроить> Нажмите ИЗМЕНИТЬ> Выберите IIS_USER (если не существует, создайте с полными правами) и дайте завершение доступ и нажмите ОК.
Перейдите на вкладку «Удостоверение»> Вы можете выбрать «Интерактивный пользователь» или «Этот пользователь»> Нажмите «Применить» и «ОК». Если вы выберете «Этот пользователь», мы должны предоставить этому серверу пользователя с правами администратора.
Ответы:
Похоже, какая бы программа или процесс вы ни пытались инициализировать, они либо не установлены на вашем компьютере, либо имеют поврежденную установку, либо их необходимо зарегистрировать.
Либо установите, либо отремонтируйте (с помощью «Установка и удаление программ»), либо зарегистрируйте (с помощью Regsvr32.exe).
Вы не предоставили нам достаточно информации, чтобы помочь вам, кроме этой.
источник
Вам необходимо убедиться, что все ваши сборки компилируются для правильной архитектуры. Попробуйте изменить архитектуру для x86, если переустановка COM-компонента не работает.
источник
Моя проблема и решение
У меня есть 32-битная сторонняя dll, которую я установил на машине 2008 R2, которая является 64-битной.
У меня есть служба wcf, созданная в платформе .net 4.5, которая вызывает 32-битную стороннюю dll для процесса. Теперь у меня есть свойство сборки, настроенное на «любой» процессор, и я развернул его на 64-битном компьютере.
при попытке вызвать службу wcf возникла ошибка «Класс 80040154 не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG»
Теперь я использовал ProcMon.exe, чтобы отследить проблему реестра com и определил, что процесс ищет записи реестра в HKLM \ CLSID и HKCR \ CLSID, где нет записи.
Стало известно, что Microsoft не будет регистрировать 32-битные компоненты com в пути HKLM \ CLSID, HKCR \ CLSID на 64-битной машине, а поместит запись в пути HKLM \ Wow6432Node \ CLSID и HKCR \ Wow6432Node \ CLSID.
Теперь конфликт заключается в том, что 64-битный процесс пытается вызвать 32-битный процесс на 64-битном компьютере, который будет искать запись в реестре в HKLM \ CLSID, HKCR \ CLSID. Решение состоит в том, что мы должны заставить 64-битный процесс смотреть записи реестра в HKLM \ Wow6432Node \ CLSID и HKCR \ Wow6432Node \ CLSID.
Это может быть достигнуто путем настройки свойств проекта службы wcf для целевой машины «X86» вместо «Any».
После развертывания версии «X86» на сервере 2008 R2 возникла проблема «System.BadImageFormatException: не удалось загрузить файл или сборку»
Решением этого badimageformatexception является установка для Enable32bitApplications значения True в свойствах пула приложений IIS для правильного пула приложений.
источник
Также обратите внимание, что контекст класса при инициализации может создать это исключение. Если у вас есть объект, кодируемый как INPROC_SERVER, но вы пытаетесь использовать CoCreateInstance как CLSCTX_LOCAL_SERVER, вы также получите эту ошибку.
Вам необходимо убедиться, что объект зарегистрирован, и CoCreateInstance создает экземпляр с правильным контекстом класса.
источник
DesktopWallpaper
используяCLSCTX_INPROC
(вместоCLSCTX_ALL
), вы получите0x80040154 (REGDB_E_CLASSNOTREG)
ошибку.Если вы используете 64-разрядные компоненты COM в веб-приложении на IIS, убедитесь, что пул приложений не разрешает 32-разрядные приложения ( Включить 32-разрядные приложения: false в дополнительных настройках)
источник
Я заставил его работать, включив 32-битные приложения в расширенных настройках пула приложений. Щелкните правой кнопкой мыши пул приложений и выберите дополнительные настройки - включите 32-разрядные приложения. Это может кому-то помочь.
источник
Регистрируя класс (в частности, его CLSID) - см., Например, здесь .
источник
в моем случае
my platform
это x64the Dll library(sdk)
иredistributable package
это x64так
в обозревателе решений
navigate to your project
открытым
Properties
change the Platform target from AnyCPU to x64
источник
Я решил эту проблему
COM
путем регистрации переходного отверстияregsvr32
.убедитесь, что вызываемый COM-порт зарегистрирован.
Мое приложение использовало,
xceedcry.dll
а я его не регистрировал. Как только я зарегистрировал его, приложение заработало нормально.источник
Мое решение состояло в том, чтобы изменить « Включить 32-разрядные приложения » на «Истина» в дополнительных настройках относительного пула приложений в IIS.
источник
В моем случае класс был зарегистрирован правильно и построен в ЛЮБОМ ЦП / 64-битном режиме.
Но для свойства Enable 32-bit Applications пула приложений IIS приложения, которое использует этот класс, было установлено значение True .
Класс не найден из-за несоответствия архитектуры между конфигурацией пула приложений и фактическим зарегистрированным классом.
Установка параметра « Включить 32-разрядные приложения» в значение « Ложь» устранила проблему.
источник
Мне пришлось создать 64-битную конфигурацию сборки.
источник
У меня была такая же проблема с использованием MapWinGis. Я нашел решение, работая над проектом Windows Forms Visual Studio 2015, просто щелкните правой кнопкой мыши proyect-> properties-> Build, установите конфигурацию на All configurations, а в conbobox «target platform» установите его на x64.
источник
Я столкнулся с этой проблемой при вызове сборки .Net от клиента C ++ через COM. Оказывается, не удалось найти одну из сборок, от которой зависела сборка .Net. Некоторое время я боролся, пытаясь понять, что не так с первой сборкой, но на самом деле это была одна из зависимостей первой сборки. Я получил две разные ошибки при вызове CoCreateInstance () из клиента C ++. Первый: REGDB_E_CLASSNOTREG Класс не зарегистрирован. Вторая попытка: 0x80131040: определение манифеста обнаруженной сборки не соответствует ссылке на сборку.
Поэтому убедитесь, что ссылки на вашу сборку присутствуют. Я обнаружил это, просмотрев первую сборку с помощью dotPeek и заметил, что одна из ссылок на нее отсутствует. Размещение правильной версии зависимости в папке устранило обе ошибки.
источник
Я компилировал свое приложение, нацеленное на любой процессор, и основная проблема оказалась в том, что был установлен Adobe Reader, более старый v10.x необходимо обновить v11.x , вот как я могу решить эту проблему.
источник
Я столкнулся с той же проблемой, используя класс COM, то есть «исключение класса не зарегистрировано» во время выполнения. Мне удалось решить эту проблему, перейдя в файл app.config и изменив элементы «startup» и «supportedRuntime» на что-то вроде:
<configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> </configuration>
Вы можете узнать больше о деталях здесь http://stackoverflow.com/questions/1604663/
и здесь https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx
Следует отметить, что я запускаю Visual Studio 2017. Target cpu = x86 Embed Interop Type = true (в окне свойств)
источник
перейдите в каталог .Net framework и зарегистрируйте соответствующую dll с помощью пути dll белого пространства Regsvr32.exe .
источник
Я столкнулся с той же проблемой. После некоторого исследования я нашел исправление для себя, и оно может оказаться полезным. По моим наблюдениям, проблема связана не только с переустановкой, она также зависит от прав доступа.
Шаг 1. Восстановите конкретный COM-объект.
Шаг 2: Службы компонентов> Компьютеры> Мой компьютер> Конфигурация DCOM> Выберите свой COM-объект> щелкните правой кнопкой мыши> Свойства> вкладка Безопасность> Разрешения доступа> Выберите Настроить> Нажмите ИЗМЕНИТЬ> Выберите IIS_USER (если не существует, создайте с полными правами) и дайте завершение доступ и нажмите ОК.
Перейдите на вкладку «Удостоверение»> Вы можете выбрать «Интерактивный пользователь» или «Этот пользователь»> Нажмите «Применить» и «ОК». Если вы выберете «Этот пользователь», мы должны предоставить этому серверу пользователя с правами администратора.
Шаг 3: Откройте диспетчер IIS> перезапустите пулы приложений.
Примечание. При необходимости перезапустите сервер.
источник
Здесь найдите решение, запустите инструмент mmc -32 (не dcomcfg)
В 64-битной системе с 32-битным Office попробуйте следующее:
Start Run mmc -32 File Add Remove Snap-in Component Services Add OK Console Root Component Services Computers My Computer DCOM Config Microsoft Excel Application
источник