등록되지 않은 COM 예외 클래스를 해결하는 방법 (HRESULT의 예외 : 0x80040154 (REGDB_E_CLASSNOTREG))?


93

COM 클래스의 인스턴스를 만들려고하면 다음과 같이 예외가 발생합니다.

클래스가 등록되지 않았습니다 (HRESULT 예외 : 0x80040154 (REGDB_E_CLASSNOTREG))

어떻게 해결할 수 있는지 제안 해주세요.


1
코드를 좀 더 자세히 설명해 주시겠습니까?
Xaisoft

10
두 가지 질문이 있습니다. 1. Windows 7 x64 컴퓨터에 COM 구성 요소를 설치 / 등록 했습니까? 2. 어플리케이션의 대상 플랫폼은 무엇입니까? 플랫폼을 x86으로 설정해야한다고 생각합니다. "Any CPU"로 설정하지 마십시오. 먼저 COM을 등록한 다음 실행하여 응용 프로그램을 테스트하십시오. 다음 문서를 참조하십시오. support.microsoft.com/kb/146219 및 Regsvr32 사용법 및 오류 메시지 설명
JackWang

빌드 대상을 'x86'으로 변경하지 않고 해결했습니다. 링크의 솔루션 : < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

답변:


49

초기화하려는 프로그램이나 프로세스가 컴퓨터에 설치되어 있지 않거나 손상된 설치가 있거나 등록이 필요한 것 같습니다.

설치, 복구 (프로그램 추가 / 제거를 통해)하거나 등록 (Regsvr32.exe를 통해)합니다.

이보다 더 많은 도움을 드릴 수있는 충분한 정보를 제공하지 않았습니다.


4
RegSvr32.exe를 의미한다고 생각하십시오 (RegSrv32.exe와 반대).
windowsgm 2013

60

모든 어셈블리가 올바른 아키텍처에 맞게 컴파일되고 있는지 확인해야합니다. COM 구성 요소 재설치가 작동하지 않으면 x86의 아키텍처를 변경해보십시오.


이로 인해 NAV 2009 R2 클라이언트 (ClassID 50000004-0000-1000-0001-0000836BD2D2)를 찾지 못하는 프로세스가 해결되었습니다.
Vincent Vancalbergh

14

내 문제와 해결책

64 비트 인 2008 R2 컴퓨터에 설치 한 32 비트 타사 dll이 있습니다.

프로세스를 위해 32 비트 타사 dll을 호출하는 .net 4.5 프레임 워크에서 만든 wcf 서비스가 있습니다. 이제 '모든'cpu를 대상으로하는 빌드 속성을 설정하고 64 비트 컴퓨터에 배포했습니다.

wcf 서비스를 호출하려고 할 때 "80040154 클래스가 등록되지 않았습니다 (HRESULT 예외 : 0x80040154 (REGDB_E_CLASSNOTREG") "오류가 발생했습니다.

이제 ProcMon.exe를 사용하여 com 레지스트리 문제를 추적하고 프로세스가 항목이없는 HKLM \ CLSID 및 HKCR \ CLSID에서 레지스트리 항목을 찾고 있음을 확인했습니다.

Microsoft가 32 비트 com 구성 요소를 64 비트 컴퓨터의 HKLM \ CLSID, HKCR \ CLSID 경로에 등록하지 않고 HKLM \ Wow6432Node \ CLSID 및 HKCR \ Wow6432Node \ CLSID 경로에 항목을 배치한다는 사실을 알게되었습니다.

이제 충돌은 HKLM \ CLSID, HKCR \ CLSID에서 레지스트리 항목을 찾는 64 비트 시스템에서 32 비트 프로세스를 호출하려는 64 비트 프로세스입니다. 해결책은 64 비트 프로세스가 HKLM \ Wow6432Node \ CLSID 및 HKCR \ Wow6432Node \ CLSID에있는 레지스트리 항목을 보도록 강제해야한다는 것입니다.

이는 'Any'대신 'X86'시스템을 대상으로하는 wcf 서비스 프로젝트 속성을 구성하여 수행 할 수 있습니다.

2008 R2 서버에 'X86'버전을 배포 한 후 "System.BadImageFormatException : 파일 또는 어셈블리를로드 할 수 없음"문제가 발생했습니다.

이 badimageformatexception에 대한 해결책은 올바른 apppool의 IIS Apppool 속성에서 'Enable32bitApplications'를 'True'로 설정하는 것입니다.


여러 질문에 동일한 답변을 게시하지 마십시오. 좋은 답변 하나를 게시 한 다음 투표 / 플래그하여 다른 질문을 중복으로 종료합니다. 질문이 중복되지 않는 경우 질문에 대한 답변을 수정합니다 .
kleopatra

10

또한 초기화 할 때 클래스 컨텍스트가 해당 예외를 생성 할 수 있습니다. INPROC_SERVER로 코딩 된 개체가 있지만 CLSCTX_LOCAL_SERVER로 CoCreateInstance를 시도하면 해당 오류도 발생합니다.

개체가 등록되어 있고 CoCreateInstance가 올바른 클래스 컨텍스트를 사용하여 인스턴스를 만들고 있는지 확인해야합니다.


예, 예를 들어 (대신 )을 DesktopWallpaper사용하여 만들 려고하면 오류가 발생합니다. CLSCTX_INPROCCLSCTX_ALL0x80040154 (REGDB_E_CLASSNOTREG)
user362515

9

IIS의 웹 응용 프로그램에서 64 비트 COM 구성 요소를 사용하는 경우 응용 프로그램 풀이 32 비트 응용 프로그램을 허용하지 않도록 설정되어 있는지 확인하십시오 ( 고급 설정에서 32 비트 응용 프로그램 사용 : false ).


5

응용 프로그램 풀 고급 설정에서 32 비트 응용 프로그램을 활성화하여 작동하도록했습니다. 응용 프로그램 풀을 마우스 오른쪽 단추로 클릭하고 고급 설정을 선택하고 32 비트 응용 프로그램을 활성화합니다. 이것은 누군가를 도울 수 있습니다.


저도 마찬가지입니다. 64 비트 개발 머신, 64 비트 테스트 및 64 비트 라이브 서버에서 사용되는 32 비트 dll. dev box에서 잘 작동했습니다. 테스트 및 라이브 서버에 배포 할 때 각 IIS 앱 풀에서 32 비트 앱이 허용되고 풀이 다시 시작될 때까지 실패했습니다. 또한 "Embed Interop Types"(VS에서 문제가되는 dll에 대한 설정)를 끄고 "Copy Local"= true로 설정하여 dll이 실제로 원본 형식으로 서버에 복사되었는지 확인해야했습니다.
cymorg

3

클래스 (특히 CLSID)를 등록하여-예를 들어 여기를 참조 하십시오 .


또한 그의 컴퓨터 나 서버에 설치해야하는 객체 일 수도 있고 반드시 클래스 등록일 필요는 없습니다.
Xaisoft

@Xaisoft, "설치"는 일반적으로 내가 언급 한 MSDN URL에서 "등록"을 포함합니다.
Alex Martelli

3

나의 경우에는

my platform x64입니다.

the Dll library(sdk)그리고 redistributable packagex64입니다

그래서

  1. 솔루션 탐색기에서 navigate to your project

  2. 열다 Properties

  3. change the Platform target from AnyCPU to x64

여기에 이미지 설명 입력


2

나는이 문제를 해결하는 방법은 등록했다 COM통해를 regsvr32.

호출하는 COM이 등록되어 있는지 확인하십시오.

내 응용 프로그램이 사용 중이 xceedcry.dll었고 등록하지 않았습니다. 일단 등록하면 응용 프로그램이 제대로 작동했습니다.


2

내 해결책은 IIS의 관련 앱 풀에 대한 고급 설정에서 " 32 비트 응용 프로그램 사용 "을 True 로 변경하는 것이 었습니다 .

앱 풀

32 비트 애플리케이션 활성화


2

제 경우에는 클래스가 올바르게 등록되었고 모든 CPU / 64 비트 모드로 빌드되었습니다 .

그러나 클래스를 사용하는 응용 프로그램IIS 응용 프로그램 풀32 비트 응용 프로그램 사용 속성은 True 로 설정되었습니다 .

응용 프로그램 풀 구성과 실제 등록 된 클래스 간의 아키텍처 불일치로 인해 클래스를 찾을 수 없습니다.

32 비트 응용 프로그램 활성화False 설정 하면 문제가 해결되었습니다. IIS 앱 풀 설정


1

저에게는 64 비트 빌드 구성을 만들어야했습니다.


1

MapWinGis를 사용하여 동일한 문제가 발생했습니다. Visual Studio 2015 Windows Forms proyect에서 작업하는 솔루션을 찾았습니다. proyect-> properties-> Build를 마우스 오른쪽 버튼으로 클릭하고 구성을 모든 구성으로 설정하고 conbobox "platform target"에서 x64로 설정합니다.


0

COM을 통해 C ++ 클라이언트에서 .Net 어셈블리를 호출하는이 문제가 발생했습니다. .Net 어셈블리가 의존하는 어셈블리 중 하나를 찾을 수 없습니다. 나는 1 차 어셈블리의 문제점을 파악하기 위해 잠시 씨름했지만 실제로는 1 차 어셈블리의 종속성 중 하나였습니다. C ++ 클라이언트에서 CoCreateInstance ()를 호출 할 때 두 가지 다른 오류가 발생했습니다. 첫 번째는 REGDB_E_CLASSNOTREG 클래스가 등록되지 않았습니다 . 두 번째 시도는 다음 과 같습니다 . 0x80131040 : 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.

따라서 어셈블리의 참조가 있는지 확인하십시오. dotPeek로 첫 번째 어셈블리를 탐색하고 참조 중 하나가 누락되었음을 알아 차림으로써 이것을 발견했습니다. 폴더에 올바른 버전의 종속성을 배치하면 두 오류가 모두 해결되었습니다.


0

모든 CPU를 대상으로 응용 프로그램을 컴파일 하고 있었고 주요 문제는 어도비 리더가 이전 v10.x 에 설치되어 v11.x업그레이드 해야한다는 것이 밝혀졌습니다. 이것이이 문제를 해결하는 방법입니다.


0

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 (속성 창에서)


0

.Net 프레임 워크의 디렉토리로 이동하여 Regsvr32.exe 공백 dll 경로에 해당 dll을 등록 하십시오 .


0

나는 같은 문제에 직면했습니다. 몇 가지 조사를 마친 후 수정 사항을 찾았으며 유용 할 수 있습니다. 이 문제는 내 관찰 당시 재설치와 관련이있을뿐만 아니라 액세스 권한에 따라 다릅니다.

1 단계 : 특정 COM 개체를 복구합니다.

2 단계 : 구성 요소 서비스> 컴퓨터> 내 컴퓨터> DCOM 구성> COM 개체 선택> 속성> 보안 탭> 액세스 권한> 사용자 지정 선택> 편집 클릭> IIS_USER 선택 (존재하지 않는 경우 완전한 권한으로 생성) 및 완료 제공 액세스하고 확인을 클릭합니다.

아이디 탭으로 이동> "대화 형 사용자"또는 "이 사용자"선택> 적용 후 확인을 클릭합니다. "이 사용자"를 선택하면 해당 서버에 관리 권한이있는 사용자를 부여해야합니다.

3 단계 : IIS 관리자를 열고 응용 프로그램 풀을 다시 시작합니다.

참고 : 필요한 경우 서버를 다시 시작하십시오.


-1

여기에서 해결책을 찾고 mmc -32 도구 (dcomcfg 아님)를 실행하십시오.

32 비트 Office가있는 64 비트 시스템에서 다음을 시도하십시오.

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

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.