COM 클래스의 인스턴스를 만들려고하면 다음과 같이 예외가 발생합니다.
클래스가 등록되지 않았습니다 (HRESULT 예외 : 0x80040154 (REGDB_E_CLASSNOTREG))
어떻게 해결할 수 있는지 제안 해주세요.
COM 클래스의 인스턴스를 만들려고하면 다음과 같이 예외가 발생합니다.
클래스가 등록되지 않았습니다 (HRESULT 예외 : 0x80040154 (REGDB_E_CLASSNOTREG))
어떻게 해결할 수 있는지 제안 해주세요.
답변:
초기화하려는 프로그램이나 프로세스가 컴퓨터에 설치되어 있지 않거나 손상된 설치가 있거나 등록이 필요한 것 같습니다.
설치, 복구 (프로그램 추가 / 제거를 통해)하거나 등록 (Regsvr32.exe를 통해)합니다.
이보다 더 많은 도움을 드릴 수있는 충분한 정보를 제공하지 않았습니다.
모든 어셈블리가 올바른 아키텍처에 맞게 컴파일되고 있는지 확인해야합니다. COM 구성 요소 재설치가 작동하지 않으면 x86의 아키텍처를 변경해보십시오.
내 문제와 해결책
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'로 설정하는 것입니다.
또한 초기화 할 때 클래스 컨텍스트가 해당 예외를 생성 할 수 있습니다. INPROC_SERVER로 코딩 된 개체가 있지만 CLSCTX_LOCAL_SERVER로 CoCreateInstance를 시도하면 해당 오류도 발생합니다.
개체가 등록되어 있고 CoCreateInstance가 올바른 클래스 컨텍스트를 사용하여 인스턴스를 만들고 있는지 확인해야합니다.
DesktopWallpaper사용하여 만들 려고하면 오류가 발생합니다. CLSCTX_INPROCCLSCTX_ALL0x80040154 (REGDB_E_CLASSNOTREG)
응용 프로그램 풀 고급 설정에서 32 비트 응용 프로그램을 활성화하여 작동하도록했습니다. 응용 프로그램 풀을 마우스 오른쪽 단추로 클릭하고 고급 설정을 선택하고 32 비트 응용 프로그램을 활성화합니다. 이것은 누군가를 도울 수 있습니다.
COM을 통해 C ++ 클라이언트에서 .Net 어셈블리를 호출하는이 문제가 발생했습니다. .Net 어셈블리가 의존하는 어셈블리 중 하나를 찾을 수 없습니다. 나는 1 차 어셈블리의 문제점을 파악하기 위해 잠시 씨름했지만 실제로는 1 차 어셈블리의 종속성 중 하나였습니다. C ++ 클라이언트에서 CoCreateInstance ()를 호출 할 때 두 가지 다른 오류가 발생했습니다. 첫 번째는 REGDB_E_CLASSNOTREG 클래스가 등록되지 않았습니다 . 두 번째 시도는 다음 과 같습니다 . 0x80131040 : 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.
따라서 어셈블리의 참조가 있는지 확인하십시오. dotPeek로 첫 번째 어셈블리를 탐색하고 참조 중 하나가 누락되었음을 알아 차림으로써 이것을 발견했습니다. 폴더에 올바른 버전의 종속성을 배치하면 두 오류가 모두 해결되었습니다.
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 (속성 창에서)
나는 같은 문제에 직면했습니다. 몇 가지 조사를 마친 후 수정 사항을 찾았으며 유용 할 수 있습니다. 이 문제는 내 관찰 당시 재설치와 관련이있을뿐만 아니라 액세스 권한에 따라 다릅니다.
1 단계 : 특정 COM 개체를 복구합니다.
2 단계 : 구성 요소 서비스> 컴퓨터> 내 컴퓨터> DCOM 구성> COM 개체 선택> 속성> 보안 탭> 액세스 권한> 사용자 지정 선택> 편집 클릭> IIS_USER 선택 (존재하지 않는 경우 완전한 권한으로 생성) 및 완료 제공 액세스하고 확인을 클릭합니다.
아이디 탭으로 이동> "대화 형 사용자"또는 "이 사용자"선택> 적용 후 확인을 클릭합니다. "이 사용자"를 선택하면 해당 서버에 관리 권한이있는 사용자를 부여해야합니다.
3 단계 : IIS 관리자를 열고 응용 프로그램 풀을 다시 시작합니다.
참고 : 필요한 경우 서버를 다시 시작하십시오.