문제

C++의 수명이 거의 끝나가는 모놀리식 MFC GUI 앱이 있습니다.우리는 C#으로 새로운 기능을 구축하고 각 앱 간에 데이터를 전달할 계획입니다.

질문은:C++와 C# 간에 데이터를 전달하는 가장 좋은 방법은 무엇입니까?

노트:
양쪽 끝에는 GUI 프런트 엔드가 있으며 ID와 같은 간단한 데이터만 전달하면 되고 사용할 프로세스/기능을 다른 앱에 알려주는 메커니즘도 있을 수 있습니다.
예를 들어 응용 프로그램 중 하나는 그리드의 행을 두 번 클릭하면 MFC 앱의 고객 양식에서 해당 고객을 열라는 메시지와 customerId를 전달하는 C#의 CRM 시스템입니다.

제가 약간 조사해 본 결과 옵션은 Windows 메시징, 메모리 매핑, 명명된 파이프 또는 Windows 소켓과 같은 것 같습니다.이 단계에서 우리는 Named Pipes로 기울고 있지만 다른 조언이나 팁 또는 다른 사람들의 경험에 진심으로 감사드립니다.

도움이 되었습니까?

해결책

개인적으로 나는 C ++ 측면에서 사용하기 쉽기 때문에 이름이 지정된 파이프와 같은 것을 사용하려고 생각하고 있습니다.

또한 시간이 지남에 따라 다른 .NET 비트 비트를 교체하려는 경우 저항이 가장 적은 경로 일 것입니다.

다른 팁

골라보세요:

  • 파일
  • 명명된 파이프 <-- 내 추천
  • 공유 메모리
  • 소켓
  • COM
  • Windows 메시지

왜 파이프라는 이름을 붙였나요?

  • 무료로 작업할 수 있는 FIFO 방식을 제공합니다(소켓과 비슷하지만 공유 메모리와는 다릅니다).
  • 양방향으로 쉽게 의사소통 가능
  • 모든 플랫폼에서 잘 지원됩니다.
  • 사용하기 쉬운
  • 안정적인 데이터 전달 및 전달
  • 차단 및 비차단 가능
  • 제거하지 않고 데이터를 읽을 수 있습니다(소켓과 달리).
  • 쉽게 세 번째 앱을 포함하도록 확장할 수 있습니다.

.Net에서는 System.IO.Pipes를 사용하세요.

C++에서는 CreateNamedPipe 및 CreateFile을 사용합니다.

관리 측면에서 P/호출을 사용할 수도 있습니다. MFC 앱에 C API가있는 경우 유용합니다. 또한 양쪽에서 com을 사용할 수 있습니다.

귀하가 나열하는 옵션은 확실히 유효하지만 COM을 고려할 수도 있습니다.

소켓 (TCP)을 사용합니다. MFC와 .NET는 모두 직접 지원합니다.

정말로 두 가지 프로세스가 필요합니까?

관리되지 않은 C ++ 및 관리되는 C# 코드는 동일한 프로세스에서 완벽하게 작동 할 수 있으며, 작은 관리 C ++/CLI의 작은 계층으로 간단한 기능 호출로 간단한 통신의 복잡성을 대체 할 수 있습니다.

내 선택은 표준 창 메시지 (예 : WM_Foo) 또는 DCOM입니다.

  • 통신이 매우 간단한 한 메시지가 작동하고 설정의 오버 헤드가 최소화됩니다. 통신을 메시지 당 하나 또는 두 개의 정수로 끓일 수 있다면이 곳은 아마도 시작하기에 좋은 장소 일 것입니다. 두 앱이 이미 창문 응용 프로그램 인 경우 이미 메시지 루프가 있으므로 이미 대부분의 길이 있습니다.

  • DCOM은 더 많은 프로그래머 오버 헤드가 필요하지만, 더 풍부한 인터페이스를 정의하고 복잡한 메시지를 이진 형식으로/에서 변환 할 필요가 없다는 점에서 좋습니다. 이 경로를 사용하는 경우 CoregisterClassObject는 DCOM을 통해 객체를 게시하기위한 시작점입니다. 나는 c# 앱에서 이것을 시도한 적이 없지만 원칙적으로는 전적으로 가능해야합니다.

레거시 앱의 소스가 있다고 가정하면 모든 "Workhorse"코드를 DLL로 컴파일 할 수 없는지 확인한 다음 개별 기능/창을 호출하십시오. 해당 작업을 수행하면 필요한 기능 주위에 관리 된 C ++ 래퍼를 작성하고 C# 코드에서 호출 할 수 있습니다. 운이 좋으면 전체 과정이 하루도 걸릴 수 있습니다.

앱이 실행될 모든 시스템에 존재하는 .NET 프레임 워크에 대해 걱정할 필요가 없다면 C ++/CLI라고 말합니다. 그러나 그것은 당신이 가장 편안하고 친숙한 것에 달려 있습니다. C ++/CLI 및 COM의 기존 '기능 호출'구조가 마음에 들지만 (다른 프로토콜로 구축하는 것과는 대조적으로) 그것은 저입니다.

현재 .NET이 존재하지 않는 경우 폴백으로 기능해야 할 필요성으로 인해 Com을 사용하여 일부 .NET 구성 요소 기능을 추가하기 위해 COM을 사용하고 있지만 최대 배포가 선호되는 경우 내 요구에 따라 다릅니다.

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