문제

시나리오 : 두 C# 프로젝트 프로젝트가 포함되어 있는데, 이는 역사적 이유로 COM (COM Interop을 통해)을 사용하여 서로 통신해야합니다. COM 서버는 프로세스 내 자동화 객체 ( "서버"라고 호출)이며 COM 클라이언트는 다음과 같이 서버를로드하는 간단한 C# 콘솔 응용 프로그램입니다.

        var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
        var objLateBound = Activator.CreateInstance(objType);

Visual Studio는 프로젝트 설정에서 해당 옵션이 활성화되면 COM Interop에 대한 어셈블리를 자동으로 등록하므로 서버를 등록하는 데 사용하는 것입니다 (여기에서 개발자 경험에만 관심이 있고 설치는 별도 문제입니다). 프로젝트가 32 비트 코드를 생성하도록 설정되거나 COM 클라이언트가 32 비트입니다.

문제는 64 비트 시스템에서 개발할 때 발생하며 두 프로젝트 모두 '모든 CPU'에 대한 코드를 생성하도록 설정되어 64 비트 모드로 실행됩니다. 다음과 같은 오류가 발생합니다.

"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."

일부 조사 후 MSBuild 스크립트는 32 비트 등록 만 수행하는 것으로 보입니다. 그것은 progid를 64 비트 레지스트리 섹션과 하위 키 clsid 및 적절한 classID와 함께 넣습니다. 그러나 clsid {clsid} 물건은 없습니다. 32 비트 용 WOW6432 하위 트리에만 있습니다. 따라서 액티비아는 클래스 공장을 찾을 수 없기 때문에 클래스 공장을 검색 할 수 없습니다.

내가 이것에 대한 답을 얻으면 SO 커뮤니티에 정말 감동 할 것입니다. 그러나 여기에 간다.

다른 사람 이이 문제를 일으키는 사람이 있습니까? 어떻게 해결 했습니까? COM Interop 어셈블리가 64 비트 개발 기계에 올바르게 등록되도록하는 가장 쉬운 방법은 무엇입니까?

도움이 되었습니까?

해결책

우리는이 문제를 발견하고 X86의 어셈블리를 생성하기위한 프로젝트를 설정하여 해결했습니다. 물론 이것은 차선책이지만, 우리는 또한 몇 개의 네이티브 32 비트 리브를 가지고 있으므로 어쨌든 그렇게해야했습니다.

다른 팁

다음 KB 항목으로 이것을 해결할 수있었습니다. 기본적으로 프로젝트 빌드 설정에서 COM Interop에 등록을 끄고 구축 후 명령을 사용했습니다.

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

http://support.microsoft.com/kb/956933

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top