2010-06-07 4 views
14

관리되는 64 비트 프로세스에서 네이티브 32 비트 코드를 호출해야하는 상황 64 비트 기계 및 응용 프로그램이 보급됨에 따라 증가하고 있습니다. 내 응용 프로그램을 32 비트로 표시하고 싶지 않고 64 비트 버전의 코드를 가져올 수 없습니다.관리 코드 래퍼를 사용하여 64 비트 관리 코드에서 32 비트 비 관리 코드를 호출하는 가장 좋은 방법

나는 현재 64 비트 프로세스에서 32 비트 통화를하는 과정에서로드 된 C++ COM 쐐기를 만드는 것입니다 사용하는 솔루션입니다.

이 COM 심 솔루션은 잘 작동하며 COM을 통해 교차 프로세스 호출이 처리되므로이 방법의 오버 헤드가 최소화됩니다.

그러나 나는이 일의 오버 헤드를 최소화 어떤 프레임 워크가 있다면 우리는 C#을 사용 수행하고 궁금해하는 모든 새로운 개발을 계속하고 싶습니다. IPCChannel을 살펴 보았지만이 접근법은 COM 심 솔루션만큼 깔끔하지는 않습니다.

덕분에, 에드

+1

COM 솔루션은 IMO와 같은 방식으로 들립니다. –

답변

7

동일한 문제가있어서 해결책은 remoting입니다. 기본적 프로젝트 구성 : X32의 P와

  • CalculatorNative 내부 정적 클래스

    • 플랫폼 독립적 CalculatorRemote.dll 라이브러리/방법을 CalculatorNative에서 원시 메소드를 사용 MarshalByRefObject로부터 유도
    • RemoteCalculator 클래스를 호출;
  • 메인 플랫폼 독립적 C# 1 라이브러리 (예컨대 Calculator.dll), 개인적 필요 X32 기능을 호출하는 클래스 RemoteCalculator 단독을 사용 하였다 Calculator 클래스, CalculatorRemote.dll을 참조;
  • x32 콘솔 응용 프로그램은 RemoteCalculatorCalculatorRemote.dll에서 Calculator.dll을 사용하여 IpcChannel을 통해 호스팅합니다.

그래서 경우 주요 응용 프로그램은 RemoteCalculator 인스턴스를 원격으로 64 모드 그것은 RemoteCalculator 호스트 응용 프로그램을 산란 및 사용에 시작했다. (x32에서는 로컬 인스턴스 인 RemoteCalculator을 사용했습니다.) 까다로운 부분은 계산기 호스트 응용 프로그램을 종료하라는 것입니다.

나는이 생각이 있기 때문에 COM을 사용하는 것보다 더 나은 :

  • 당신은 어디 COM 클래스를 등록 할 필요가 없습니다;
  • COM과의 상호 운용은 .NET 원격보다 느립니다.
  • 때때로 COM 측에서 문제가 발생하면 응용 프로그램을 다시 시작해야합니다. (아마 나는 COM에 익숙하지 않을 수도 있습니다.)
  • x32 모드에서 실행하면 원격 처리에서 성능이 저하되지 않습니다. 모든 메소드는 동일한 AppDomain에서 호출됩니다.
5

거의 유일한 대답은 프로세스 통신 벗어났습니다. 32 비트의 모든 호출을 필요로하고 Windows 메시지, WCF, Named Pipe, 메모리 맵 파일 (4.0) 등을 통해 통신 할 수있는 32 비트 실행 파일 인 .NET 프로젝트를 만들 수 있습니다. 이것이 Paint.NET이 WIA (Windows Imaging Acquisition)를 64 비트 프로세스에서 수행하는 방법입니다.

PDN의 경우 예상되는 파일의 이름을 출력으로 전달하지만 더 복잡한 통신은 어렵지 않습니다. 그것은 당신이하고있는 일에 따라 갈 수있는 더 좋은 방법 일 수 있습니다.

관련 문제