다음 오류로 인해 CLSID가 {XXXX} 인 구성 요소에 대한 COM 클래스 팩토리 검색에 실패했습니다 : 80040154


278

C # .NET을 사용하여 PDF 보고서를 생성하는 Windows 서비스를 개발했습니다. PDF 파일을 생성하려면 타사 dll을 사용하고 있습니다. 응용 프로그램이 Windows XP 플랫폼에서 실행되고 있습니다. Windows Server 2008 64 비트 버전 에서 서비스를 배포 할 때이 오류가 발생했습니다.

다음 오류로 인해 CLSID가 {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} 인 구성 요소에 대한 COM 클래스 팩토리 검색에 실패했습니다 : 80040154.

regsvr32 명령을 사용하여 DLL을 등록했습니다. 레지스트리에서이 CLSID를 볼 수 있습니다. 그러나 문제는 지속됩니다.

무엇이 문제 일 수 있습니까?


1
동일한 서버에서 호스팅되는 웹 응용 프로그램은 오류없이 PDF 파일을 생성 할 수 있습니다.
gopal 2016 년

나는 가능한 모든 해결책을 시도했지만 여전히이 오류가 발생합니다. 어셈블리가 있고 성공적으로 등록했지만 여전히 같은 오류가 발생합니다. 정말 도움이 필요합니다 ...
newprogress

답변:


383

VS-프로젝트 속성-빌드 탭-플랫폼 대상 = X86


7
VS2008에서는 '컴파일-> 고급 컴파일 옵션 ...'(창 탭의 맨 아래)과 '대상 CPU'(x86) 에서이 옵션을 찾았습니다.
Rodolfo

1
+1 이상이 필요하지만 +1 만 있으면됩니다
David

7
이것이 항상 해결책은 아닙니다.

2
당신은 저의 해외 은행 계좌, 핫도그 대 및 나의 결혼을 저를 구했습니다. 감사합니다
Donald. 레코드

2
동일한 오류 메시지가 있지만이 솔루션은 작동하지 않습니다.
Akram Khan

59

나는 매우 비슷한 문제에 부딪쳤다.

64 비트 컴퓨터에서 개발중인 웹 응용 프로그램 내에서 이전 32 비트 DLL을 사용해야했습니다. 해당 폴더의 regsrv32 버전을 사용하여 32 비트 DLL을 windows \ sysWOW64 폴더에 등록했습니다.

타사 DLL에 대한 호출은 Visual Studio의 단위 테스트에서 작동했지만 80040154 오류와 함께 같은 컴퓨터의 IIS에서 호스팅되는 웹 응용 프로그램에서는 실패했습니다.

응용 프로그램 풀을 "32 비트 응용 프로그램 사용"으로 변경하면 문제가 해결되었습니다.


1
이것이 내가이 문제를 해결하는 가장 쉬운 방법입니다. 감사!
덱스터

6
나는이 답변을 정말 좋아합니다. 어느 시점에서 하나의 작은 32 비트 DLL 만 호출 할 때 x86에 대한 전체 웹 사이트를 컴파일 할 필요는 없습니다.
DanM7

@Daniel Ballinger 내 응용 프로그램을 변경하는 동안 32 비트 프로세스로 실행됩니까?
초보자

@Danny sysWOW64에 등록한 DLL에 액세스 할 수 없으므로 믿지 않습니다.
Daniel Ballinger

1
같은 문제가 있지만 응용 프로그램 풀을 변경하는 방법을 모르겠습니다.이 작업을 수행해야하는 곳, PLZ가 도와주세요
Shima.Y

58

서비스가 '모든 CPU'에 대해 빌드 된 것처럼 들리므로 COM 구성 요소를 사용하는 64 비트에서 오류가 발생합니다. 에 대해 빌드해야합니다 x86.

웹 사이트가 32 비트 프로세스로 실행 중일 수 있으므로 구성 요소를 사용할 수 있습니다. 솔루션을 구축 x86하면 서비스가 32 비트로 실행됩니다.


나는 또한 같은 문제에 직면하고 있습니다. 여기에서 데스크톱 응용 프로그램이 64 비트 시스템에 성공적으로 설치되었습니다. 설치하는 동안 동기화를 성공적으로 수행했지만 소프트웨어에서 동기화를 수행하면 오류 위에 표시됩니다
Mohini Mhetre

등록하려고하는데 .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)오류가 발생 했습니다. 모듈을로드하지 못했습니다. 이진이 지정된 경로에 저장되어 있는지 확인하거나 이진 또는 종속 .DLL 파일의 문제를 확인하도록 디버깅하십시오.
Naveen Kumar

32 비트로 컴파일 된 경우 SysWow64 버전이 아닌 시스템 regsvr32를 사용해야합니다.
Fandango68

SSIS 패키지를 실행하는 동안이 오류가 발생합니다. 연결이 제대로 작동합니다. 모든 속성이 정확합니다. 실제로 SSIS 패키지는 몇 달 동안 오류없이 실행되었습니다. 갑자기 위의 오류가 발생합니다. x64에서 런타임 / 디버깅을 x86으로 변경하려고 시도했지만 여전히 문제가 해결되지 않았습니다.
IamVISH

16

프로젝트 속성 플랫폼 대상 X86을 구성 할 필요가 없습니다. x86에서 작동하도록 iis 옵션을 구성 할 수도 있습니다.

  • 응용 프로그램 풀 선택
  • 앱에서 사용하는 풀을 선택하십시오
  • 고급 설정
  • 32 비트 응용 프로그램 사용 사실을

이것은 항상 저에게 사실이었습니다. 플랫폼 대상을 X86으로 설정하지 않아도되었지만 항상 • 32 비트 응용 프로그램 활성화 = True • ID 설정 = ApplicationPoolIdentity • 사용자 프로필로드 = True
Zath.

Nazim의 지침에 따라 비슷한 문제가 있었지만 "삽입 된 Interop 형식"(참조 된 dll의 속성)이 아니고 Copy Local = true로 설정해야했습니다.
cymorg

"응용 프로그램 풀 선택"은 어떻게합니까?
CodyBugstein

응용 프로그램 풀 메뉴 왼쪽에 IIS 메뉴의 목록에
나짐 hatipoglu

16

CPU 응용 프로그램을 다시 컴파일하지 않고이 작업을 수행 할 수있는 방법을 찾고 있다면 다른 가능한 해결 방법이 있습니다.

  1. HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}에서 COM 개체 GUID를 찾습니다.
  2. 찾은 후에는 새로운 REG_SZ (문자열) 값을 추가하십시오. 이름은 AppID 여야하고 데이터는 방금 검색 한 것과 동일한 COM 개체 GUID 여야합니다.
  3. HKey_Classes_Root \ Wow6432Node \ AppID 아래에 새 키를 추가하십시오. 새 키는 COM 개체 GUID와 동일하게 호출되어야합니다.
  4. 방금 추가 한 새 키에서 새 문자열 값을 추가하고이를 DllSurrogate라고합니다. 값을 비워 두십시오.
  5. HKey_Local_Machine \ Software \ Classes \ AppID \에 새 키를 만듭니다. 새 키는 COM 개체의 GUID와 동일하게 호출해야합니다. 이 키 아래에 값을 추가 할 필요가 없습니다.

나는 해결책에 대한 신용을 얻지 못했지만 그것은 우리에게 효과적이었다. 자세한 정보 및 기타 의견은 소스 링크를 확인하십시오.

출처 : https://techtalk.gfi.com/32bit-object-64bit-environment/


1
가장 훌륭한 지침. 타사 도구를 사용하고 있었으므로 빌드 플랫폼을 변경할 수 없었습니다. 이 솔루션은 그 문제를 우회했습니다. 감사합니다!

1 단계에서 설명한대로 키를 찾은 다음 어떤 COM 개체가 문제를 일으키는 지 알았습니다. 그런 다음 regsvr32를 실행합니다. 고마워요!
MichaelS

이 작업을 수행하면 로컬 웹 서버 (IIS)가 액세스 거부를 시작했습니다. 이것은 이것이 올바른 방향으로 나아가는 단계라고 말하지만 누가이 시점에서 액세스 권한을 부여할지 확실하지 않습니다. stackoverflow.com/questions/14019401/…
user420667

14

문제는 서버 프로세스가 64 비트이고 라이브러리가 32 비트이며 동일한 프로세스 (프로 시저 서버)에서 COM 구성 요소를 만들려고한다는 것입니다. 서버를 다시 컴파일하여 32 비트로 만들거나 서버를 변경하지 않고 그대로두고 COM 구성 요소를 처리하지 못하게합니다. COM 서버를 프로세스 외부로 만드는 가장 쉬운 방법은 COM + 응용 프로그램-제어판-> 관리 도구-> ComponentServices를 만드는 것입니다.


COM + 응용 프로그램을 만드는 중 오류가 발생했습니다. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee

8

컴파일 설정을 변경하지 않았습니다.

AppPool 고급 설정에서 "32 비트 응용 프로그램 활성화 = True"를 설정하십시오.

그것은 나를 위해 일했다


1
AppPool 고급 설정은 어디에 있습니까?
CodyBugstein

7

Windows 2008 Server x64 솔루션은 다음과 같습니다.

  1. 관리자 권한으로 cmd.exe를 엽니 다.
  2. dll을 C : \ Windows \ SysWOW64 폴더에 복사하십시오.
  3. C : \ Windows \ SysWOW64에서 regsvr32를 실행하십시오.
  4. dll이 Windows의 레지스트리에 있는지 확인하십시오.
  5. dll을 사용하는 .exe x86이있는 경우 exe는 x86 모드로 컴파일해야합니다.
  6. exe는 C : \ Program Files (x86) 폴더에 설치해야합니다.

이 절차는 유효합니다.


6

나는 같은 문제가 있었지만 다른 답변은 솔루션의 한 부분만을 제공했습니다.

해결책은 두 가지입니다.

등록에서 64 비트를 제거하십시오.

  • c : \ windows \ system32 \ regsvr32.exe / U
  • 다른 폴더에있는 다른 dll 사본에 대한 참조는 제거되지 않습니다.

또는

  • HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32라는 키를 찾으십시오. 이 키는 DLL의 파일 이름을 기본값으로 사용합니다.
  • HKEY_CLASSES_ROOT \ CLSID {......} 폴더를 제거했습니다.

32 비트로 등록하십시오.

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

64 비트 등록을 제거하지 않고 32 비트로 등록해도 문제가 해결되지 않습니다.


빙고! 그것이 내가 찾던 답변입니다 (다른 곳에서 내 의견 참조). 감사!
판당고 68

5

다르지만 비슷한 수정으로 관련 문제가 있습니다.

64 비트 DLL을 사용하여 Windows 서비스 프로젝트를 "Any-CPU"로 설정했습니다. 같은 오류 메시지. 많은 것들을 시도했지만 아무것도 효과가 없었습니다. 마지막으로 프로젝트 속성-> 빌드로 이동하여 프로젝트에 "32 비트 선호"가 선택되어 있음을 알았습니다. 이것을 확인하지 않고 더 이상 오류가 없습니다.

내 생각 엔 Windows 서비스가 32 비트 DLL을 기대하고 있었고 찾지 못했습니다.


그것은 이상하지만 그것은 작동합니다! 감사합니다
FindOutIslamNow

3

x86으로 변경하려면

  1. 솔루션 설치 프로젝트를 작성하십시오.
  2. 작성한 후 솔루션 탐색기로 이동하여 설정 프로젝트를 마우스 오른쪽 단추로 클릭하십시오.
    • 구성 관리자를 누르십시오.
    • "Active Solution Platform"콤보 상자를 클릭하고 새로 만들기 (x86이 표시되지 않은 경우)를 선택하십시오.
    • 첫 번째 콤보 x86에서 선택한 다음 확인을 누릅니다.
    • 설치 프로젝트를 다시 빌드 한 다음 모든 프로젝트를 다시 빌드하십시오.

3

웹 사이트를 실행중인 경우 풀의 고급 설정에서 32 비트 응용 프로그램을 사용하지 않도록 응용 프로그램 풀을 설정할 수도 있습니다.


2
나는 정반대로 32 비트 응용 프로그램을 활성화해야했습니다.
row1

2

내 개인적인 경우에는 문제가 클라이언트 컴퓨터에서 발생했기 때문에 개발자 컴퓨터의 Windows 레지스트리에서 클래스 ID를 검색하는 문제가 해결되었습니다. 이 동작은 문제를 일으키는 COM 구성 요소에 배치됩니다. OCX / COM으로 등록되지 않은 .NET 프로젝트에서 참조 된 x86 라이브러리 설치 프로그램 또는 업데이터 응용 프로그램에 대해 .

문안 인사


1

VSTO를 사용하는 사람에게는 office어셈블리에 대한 참조가 누락되었습니다 . 특정 VSTO 객체를 수동으로 인스턴스화하려는 경우에도 나타납니다.


1

내 문제는 DLL의 실제 등록과 관련이 있음을 발견했습니다.

먼저 CMD 프롬프트에서 "Regedit.exe"를 실행 한 다음 (경우에 따라 보안 수준을 "관리자 수준으로 높였습니다") 레지스트리를 검색합니다 (RegEdit 메뉴에서 "Edit / Find"를 클릭하거나 Ctrl + F를 누름). COM 클래스 팩토리와 관련하여 수신 한 오류 메시지에 CLSID가 표시됩니다. 내 CLSID는 29AB7A12-B531-450E-8F7A-EA94C2F3C05F입니다. 이 키를 찾으면 해당 Hive 노드에서 하위 키 "InProcServer2"를 선택하고 오른쪽 Regedit 프레임에서 문제 DLL의 파일 이름을 확인하십시오. "Default"아래에 표시됩니다. 해당 파일이 "C : \ Windows \ SysWow64"(예 : C : \ Windows \ SysWow64 \ Redemption.dll ")에있는 경우"C : \ Windows \ SysWow64 \ RegSvr32.exe "파일을 다음과 같이 사용해야합니다. 명령 행에서 해당 DLL을 등록하고 기본 "C : C : \ Windows \ SysWow64 \ RegSvr32.exe c : \ Windows \ SysWow64 \ Redemption.dll을 입력하십시오. "종료"를 통해 명령 창을 닫은 다음 컴퓨터 를 다시 시작 하십시오. (정상적으로) 다시 시작은 "종료"및 전원을 다시로드하는 동안 완전히 종료하고 모든 항목을 다시로드하기 때문에 항상 종료 대신 재시작을 사용하십시오. 드라이버 및 기타 값의 저장된 캐시 (오류 일 수 있음) 향후 DLL을 등록 할 때마다 C : \ Windows \ SysWow64 폴더에 저장된 DLL 및이 문제에 대해 SysWow64 "RegSvr32.exe"를 사용해야합니다. (잘못된 등록으로 인해 발생한 경우) 다시 발생하지 않아야합니다.


유용한 팁이지만 SysWow64에 32 비트 DLL을 등록하면 DLL에 64 비트 요청을 처리하는 래퍼가 있다고 가정합니다.
Fandango68

0

내 문제는 내 프로젝트 참조에 잘못된 MS Sync FrameWork 버전 (1.0)이 있다는 것입니다. 버전 2.1로 업데이트 한 후 오류가 사라지고 수명이 다시 양호합니다.


0

내 경우, 나는 MS에게 같은 오피스 파일을 생성하고있어 wordexcel, 나는 실행 Win+R및 실행 dcomcnfg의 DCOM 구성에서, (이름은 포함과 같은 선택 사무실의 관련 이름 항목 외에 Excel또는 WordOffice)와 Open the properties, select Identity tab and select the interactive user.같은 이 답변 ,

내 오류 메시지 show CLSID {000209FF-0000-0000-C000-000000000046}이므로 DCOM Config 에서이 특정 CLSID를 찾으려고 노력하고 종료하고 동일한 단계 interactive user를 수행하여 작동합니다.

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