Development Tip

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

yourdevel 2020. 10. 7. 21:20
반응형

등록되지 않은 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)를 등록하여-예를 들어 여기를 참조 하십시오 .


나의 경우에는

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

여기에 이미지 설명 입력


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

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

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


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


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


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

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


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


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

앱 풀

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


I ran into the same issue using a COM class, i.e. 'Class not registered exception' at runtime. For me I was able to resolve by going to the app.config file and change the 'startup' and 'supportedRuntime' elements to something like:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

You can read more about the details here http://stackoverflow.com/questions/1604663/

and here https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

I should note I am running Visual Studio 2017. Target cpu = x86 Embed Interop Type = true (in the properties window)


In my case the class was registered properly and built in ANY CPU / 64 bit mode.

But the Enable 32-bit Applications property of the IIS Application pool of the application which uses the class was set to True.

Class was not found because of the architecture mismatch between the application pool configuration and the actual registered class.

Setting Enable 32-bit Applications to False fixed the issue. IIS 앱 풀 설정


go to the directory of .Net framework and register their the respective dll with Regsvr32.exe white space dll path.


I have faced the same issue. After done some research i found fix for me and it may useful. The issue is not only related to re-installation as of my observation, it depends on access permissions also.

Step 1: Repair the particular COM object.

Step 2: Component Services > Computers > My Computer > DCOM Config > Select your COM object > Right click > Properties > Security tab > Access Permissions > Choose Customize > Click EDIT > Select IIS_USER (If not exists create with complete rights) and give complete access and click OK.

Move to Identity tab > You can select "Interactive user" or "This user" > Click Apply and OK. If you choose "This user", we have to give Administrative privileged user to that server

Step 3: Open IIS Manager > Restart the Application Pools.

Note: If required please restart the server


Here find the solution, run mmc -32 tool (not dcomcfg)

On 64 bit system with 32 bit Office try this:

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

여기에 이미지 설명 입력

참고 URL : https://stackoverflow.com/questions/1496214/how-to-solve-com-exception-class-not-registered-exception-from-hresult-0x80040

반응형