[c#] 등록되지 않은 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가 올바른 클래스 컨텍스트를 사용하여 인스턴스를 만들고 있는지 확인해야합니다.


답변

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


답변

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


답변

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