2009-05-17 4 views
13

소스 코드가없는 일부 레거시 32 비트 코드를 64 비트 .NET 어셈블리에서 호출 할 수있는 방식으로 프로젝트에 통합해야합니다. 원래 코드는 DLL에서 32 비트 COM 개체로 구현됩니다. Windows는 64에서 32 비트 객체로의 직접 호출을 허용하지 않으므로이 상황을 어떻게 처리할지에 대한 영감을 얻고 자합니다.64 to 32 비트 Interop - 어떻게?

레거시 32 비트 COM 개체는 어떻게 64 비트 .NET 어셈블리에서 액세스 할 수 있습니까?

업데이트 : 우리는 COM 구성 요소 자체가 원래 ANSI C의 래퍼 였음을 발견했습니다. Visual Studio에서 기본 64 비트 dll로 컴파일 한 다음이를 .NET으로 가져올 수있었습니다. 목표를 옮겨서 죄송합니다!

+0

주석, 나는 이것을 수행하지 않았으므로 COM 개체를 out-of-process 서버로 실행해야합니다. 인 프로세스로로드하면 64 비트로 실행되고 실패합니다. –

답변

8

최상의 방법은 32 비트 DLL을 래핑하는 독립 프로세스 COM 서버를 만드는 것입니다. 그러면 64 비트 코드에서 이것을 호출 할 수 있습니다.

Here is an explanation 기본 개념.

+0

우리가 다른 솔루션으로 인도 한 소스 코드를 발견했기 때문에 골 포스트를 조금 옮겼습니다. 나는이 질문에 대한 답을 가장 잘 읽고 도움이되는 독서 자료에 대한 링크로이 대답을 받아들입니다. –

3

IPC와 통신하는 두 개의 프로세스를 생성해야합니다. 이렇게하면 32 비트가 될 수 있고 64 비트가 될 수 있습니다. COM 객체와 연결하고 명명 된 파이프와 같은 일부 IPC 메커니즘을 통해 API를 노출하는 32 개의 프로그램을 만들어야합니다. 이렇게하면 .NET 프로그램이 다른 프로세스에서 액세스 할 수 있습니다.

+0

이 방법은 COM을 이미 사용하고있는 경우에도 COM interop을 사용하는 대신 명명 된 파이프로 전환하는 이유는 무엇입니까? –

+0

@ Reduce Copsey : 오, 물론, COM 용으로 사용할 수 있습니다. 하지만 제 접근 방식은 더 일반적입니다. 일반 라이브러리에서도 작동 할 수 있습니다. – Zifre

+0

WCF를 사용하여 명명 된 파이프를 사용하여 IPC를 수행 할 것을 고려했습니다. 단지 문제는 파이프의 양쪽 끝이 32 비트 어셈블리에 있어야하는 동일한 인터페이스 정의를 볼 필요가 있다는 것입니다. 당신이 그것을 실행하려고 할 때 모든 것이 폭발합니다. –

3

체크 아웃은 blog post입니다. 런타임 호출 가능 래퍼를 사용하여 64 비트 .NET 응용 프로그램에서 32 비트 COM 어셈블리를 참조 할 수 있습니다. 짧은 버전은

  1. 사용 Tlbimp.exe를 64 비트 런타임 호출 가능 래퍼를 만들 ... 다음과 같다 :

    tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  2. 는 경우 COM 어셈블리 (안 RCW)를 등록 아니 이미 있습니다.

    regsvr32.exe foo.dll

  3. 참조하는 RCW (예 : Interop.Foo.dll)를 응용 프로그램에서 가져옵니다. 빌드 구성을 x64로 변경하고 돌이켜보십시오.

+0

이것은 원래의 문제에 대한 해결책이 아닙니다. –

관련 문제