2011-11-18 2 views
2

샘플 C# COM-Visible DLL을 개발했습니다.
x86에서 빌드되고 32 비트 Regasm을 통해 등록되면 COM 클라이언트에서 잘 실행됩니다.
64 내장 및 64 비트 RegAsm을 통해 등록은 ​​COM 클라이언트 호출은 다음과 같은 오류 방울 :문제 COM interop 용 x64 어셈블리 등록

Retrieving the COM class factory for component with CLSID {A0F2F58F-7B98-3605-BEC9-84724FF1E824} failed due to the following error: 80040154. 

내가 확인하고 CLSID가 HKCR \ CLSID 아래에있는 레지스트리에 실제로 존재 함을 확인했다. 다음은

은 C#을 통해 COM 액세스를 시뮬레이션의 예입니다

var type = Type.GetTypeFromProgID("ProgID.Interop.5683"); 
var obj = Activator.CreateInstance(type); // <-- blows here 

나는 또한 PROGID 문제는 액티베이터 정확히 찾고있다 를 통해 유형에 성공적으로 액세스가 있음을 procmon를 통해 확인 ? 내 x64 등록 어셈블리를 "볼"수있는 방법은 무엇입니까? 어딘가에 추가해야 할게있어?

x86 재 빌드를 권고하는 많은 "솔루션"을 발견했습니다. 그러나 Come'on! 나는 그 일을하지 않고 COM을 위해서 x64 혜택을 모두 잃을 것입니다. 거기에 "진짜"해결책이 있습니까?

+0

어떤 상황에서 80040154 오류가 발생합니까? –

+0

@Ramhound CLSID가 적절한 위치에 없거나 없을 때. 그래서 나는 매우 혼란스러워. –

+2

특정 아키텍처에 대한 관리되는 DLL을 빌드하지 않고 EXE 프로젝트 설정 만 중요합니다. 고전적인 실수는 Regasm.exe의 잘못된 비트를 사용하거나/codebase 옵션을 잊어 버리는 것입니다. SysInternals의 ProcMon 유틸리티로 문제를 해결하십시오. –

답변

0

잠자는 밤과 약간의 암시 후 Activator가 x64 응용 프로그램에서 호출되어 x64 CLSID를 찾기 위해 레지스트리의 x64 위치를 찾아야한다고 생각했습니다. 즉, x86 응용 프로그램에서 호출 될 때 Activa는 레지스트리의 x86 위치에서 코드베이스를 포함하여 CLSID 및 후속 키를 찾습니다.

var type = Type.GetTypeFromProgID("ProgID.Interop.5683"); 
var obj = Activator.CreateInstance(type); 
+1

그 이유는 x86 및 x64 EXEs/DLL (COM 또는 기타)이 이와 같이 혼합되지 않기 때문입니다. – user7116

+0

@sixlettervariables : 예, 여기 제가 다른 질문을 통해 배웠습니다. http://stackoverflow.com/questions/8193857/calling-an-x64-assembly-via-com-from-a-32-bit-app/8194293 # 8194293 –