sourcecode

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

copyscript 2023. 5. 29. 11:06
반응형

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

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

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

제가 어떻게 해결할 수 있는지 제안해 주시겠습니까?

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

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

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

당신은 우리가 당신을 돕기에 충분한 정보를 제공하지 않았습니다.

나의 문제와 해결책

제가 2008년 R2 기계에 설치한 32비트 서드파티 dll은 64비트입니다.

.net 4.5 프레임워크에서 32비트 서드파티 dll을 호출하여 프로세스를 수행하는 wcf 서비스가 있습니다.이제 빌드 속성이 '임의' CPU를 대상으로 설정되어 64비트 시스템에 배포되었습니다.

wcf 서비스를 호출하려고 할 때 "80040154 Class not registered" 오류가 발생했습니다(HRESULT: 0x80040154(REGDB_E_CLASSNOTREG).

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

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

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

이 작업은 wcf 서비스 프로젝트 속성을 'Any'가 아닌 'X86' 시스템을 대상으로 구성하여 수행할 수 있습니다.

2008 R2 서버에 'X86' 버전을 배포한 후 "System" 문제가 발생했습니다.잘못된 이미지 형식 예외:파일 또는 어셈블리를 로드할 수 없습니다."

예외적으로 이 잘못된 이미지에 대한 해결 방법은 올바른 앱 풀에 대한 IIS Apppool 속성에서 '32비트 응용 프로그램 사용'을 '참'으로 설정하는 것입니다.

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

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

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

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

나의 경우에는

my platformx64입니다.

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등록하지 않았습니다.일단 등록을 하고 나니 애플리케이션이 잘 작동했습니다.

저의 경우 클래스가 올바르게 등록되어 있으며 모든 CPU/64비트 모드에서 빌드되었습니다.

그러나 클래스를 사용하는 응용 프로그램의 IIS 응용 프로그램 풀에 있는 32비트 응용 프로그램 사용 속성이 참으로 설정되었습니다.

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

32비트 응용 프로그램 사용을 거짓으로 설정하면 문제가 해결되었습니다.IIS 앱 풀 설정

클래스(특히 해당 CLSID)를 등록하면 여기를 참조하십시오.

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

앱 풀

32비트 응용 프로그램 사용

저도 MapWinGis를 사용하면서 같은 문제를 겪었습니다.Visual Studio 2015 windows forms project에서 작업하는 솔루션을 찾았습니다. project -> properties -> Build, set configurations to all configurations and set conbobox "platform target"에서 project를 마우스 오른쪽 버튼으로 클릭하면 됩니다.

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

애플리케이션을 .NET Framework 3.5에서 v4.7.2로 업그레이드할 때도 같은 문제에 직면했습니다.

저의 경우, 위에 언급된 모든 것(x86에 아키텍처를 타겟팅하고, COM DLL을 등록하고, 이미 완료되었습니다.)

제가 유일하게 성공한 것은 최신 .NET 프레임워크(v4.7.2의 경우)와 함께 tlbimp 명령을 실행하여 interop DLL을 다시 생성한 다음 이 DLL을 사용하여 프로젝트를 재구성하는 것입니다.그것으로 해결되었습니다.

에 전화를 걸어 이 문제에 부딪혔습니다.COM을 통해 C++ 클라이언트에서 Net Assembly.그 중 하나가 조립을 하는 것으로 밝혀졌습니다.종속된 Net 어셈블리를 찾을 수 없습니다.1차 집회의 문제점을 파악하기 위해 잠시 씨름을 했지만, 실제로는 1차 집회의 종속성 중 하나였습니다.C++ 클라이언트에서 CoCreateInstance()를 호출할 때 두 가지 오류가 발생했습니다.첫 번째는 REGDB_E_CLASSNOTREG 클래스가 등록되지 않음 두 번째 시도는 0x80131040입니다. 위치한 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.

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

CPU를 대상으로 애플리케이션을 컴파일하고 있었는데 주요 문제는 Adobe Reader가 설치된 이전 v10.x에서 v11.x를 업그레이드해야 한다는 것입니다. 이것이 이 문제를 해결하는 방법입니다.

런타임에 COM 클래스, 즉 'Class not registered exception'을 사용하여 동일한 문제가 발생했습니다.저는 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을 실행하고 있습니다.대상 cpu = x86 Embed Interop Type = true(속성 창)

디렉토리로 이동하다Netframework를 구성하고 Regsvr32.exe 화이트스페이스 dll 경로에 해당 dll을 등록합니다.

저도 같은 문제에 직면한 적이 있습니다.몇 가지 조사를 한 후에 저는 저를 위한 해결책을 찾았고 그것은 유용할 것입니다.제가 관찰한 바로는 이 문제는 재설치와 관련이 있을 뿐만 아니라 액세스 권한에 따라 다릅니다.

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

2단계: Component Services > Computers > My Computer > DCOM Config > Select your COM Object > 오른쪽 클릭 > Properties > Security 탭 > Access Permissions > Choose Customize > Edit > Select IIS_USER (존재하지 않는 경우 완전한 권한으로 생성)를 클릭하고 전체 액세스 권한을 부여한 후 OK를 클릭합니다.

Identity 탭으로 이동 > "Interactive user" 또는 "This user" > "Apply and OK"를 선택할 수 있습니다."이 사용자"를 선택할 경우 해당 서버에 관리자 권한을 부여해야 합니다.

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

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

여기서 솔루션을 찾아 mcmc-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

여기에 이미지 설명 입력

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

반응형