2010-01-06 1 views
4

전 세계의 Windows 이벤트를 연결하기 위해 C dll을 사용하고 있으며 다음 단계는 C# 응용 프로그램에 이벤트 데이터 (거대한 것도 없음)를 보냅니다.C + C# 프로세스 간 통신 : 명명 된 파이프, 메모리 매핑 파일 또는 기타?

최대한 빨리이 통신을하고 싶기 때문에 두 가지 옵션 인 Named Pipes와 Memory Mapped Files를 분석하고 있습니다.

.NET 4는 MMF를 원래 방식으로 가져 오지만 Win98 클라이언트의 존재가 가능하기 때문에 .NET 2를 대상으로해야한다는 것을 알고 있습니다. 또한 Windows API를 통해 .NET 2로 MMF를 관리 할 수있는 방법이 있다는 것을 알고 있습니다 (일부 사람들은 일부 래퍼를 빌드했습니다).

이러한 맥락에서

, 내가 알고 싶습니다 :

  1. 가 어떤 큰 단점 (성능이 주로) 명명 된 파이프 대신 MMF의 선택에 있습니까? 엄청난 양의 데이터를 전송하지 않을 것임을 기억하는 것이 중요합니다.
  2. NP 또는 MMF (.NET 2를 타겟팅)에 관련된 보안 문제가 있습니까?
  3. 그보다 더 좋은 선택이 있습니까?
+0

중요한 것은 아니지만 Win98 EOL은 2006 년 7 월 11 일이었습니다. 거기에 사람들이 여전히 고집하고 있다는 소식을 듣고 슬프다. 너를 부러워하지 않아. Filipe ... –

+0

주제에 대한 자세한 내용은 .NET 2에서 P/Invoke와 함께 MMF를 사용할 수 있습니다. –

+0

전역 후크가 각 프로세스 실행에 첨부되어 있기 때문에이 경우 P/Invoke를 사용할 수 없기 때문에 프로그램을 기본 언어 (C, Delphi, VB 등)로 작성해야합니다. 그렇습니다 Martinho,이 Win98 의존성은 실제로 악취가납니다. 슬픈 경우, 우리 팀을 상상해보십시오. :) – jfneis

답변

1

옵션 1 : C# 개체 중 하나에서 COM 인터페이스를 노출하고 C++ 응용 프로그램에서 해당 인터페이스를 호출하십시오.

옵션 2 : C++/CLI를 사용하십시오. Win32 API를 사용하여 전역 Windows 이벤트를 연결하고 C# 클라이언트가 직접 사용할 수있는 .Net 클래스를 노출 할 수 있습니다.

물론이 옵션들 중 어느 것도 네임드 파이프 대 메모리 매핑 파일에 대한 질문에 대답하지 않지만,이 두 가지 옵션 중 하나는 별도의 프로세스로 유지해야 할 필요가 없다면 더 간단해질 것입니다.

+0

Tarydon을 호출하는 방법입니다. 답변 해 주셔서 감사합니다. 옵션을 고려하기 전에 전역 후크가 코드 조각 (DLL)을 컴퓨터에서 실행되는 모든 프로세스에 연결하므로 원시 코드를 사용하여 작성해야한다는 것을 아는 것이 중요합니다. COM 종속성이 모든 실행중인 프로세스 (어쩌면 가능하지만 성능은 아님)에 첨부되므로 Option 1이 실제로 가능한지 여부는 알 수 없습니다. 옵션 2는 내가 볼 수있는 한 가능하지 않습니다. 코드가 모든 프로세스에 첨부 될 것이므로 C# 클라이언트는 처리 할 단일 포인트 클래스를 갖지 않습니다 (그 때문에 명명 된 파이프에 대해 생각하고있는 것입니다). – jfneis

2

메시지를 보낼 수있는 창이 대상 응용 프로그램에 있고 전송하는 데이터의 양이 비교적 적은 경우 WM_COPYDATA 메시지를 사용하여 정보를 전달하는 것이 좋습니다.

이 메시지는 단순한 프로세스 간 통신 (대상에 GUI가있는 경우) 용으로 설계되었으며, 거의 아무런 노력없이 기본 또는 .NET 응용 프로그램에서 사용할 수 있으며 어떤 압력이든 시스템에 영향을 미치지 않습니다 당신은 당신이 주변에 전달하는 데이터를 생성하여 메모리에 넣어, 및 Windows 95

http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx에서 모든 Windows 시스템에서만 사용할 수 있습니다

0

내가 그것을 사용하려하지 한만큼 MMF에 대해 말할 수 없다 , 그러나 그것의보기에서, 그것은 물건을 설치하기에는 너무나 복잡하게 보입니다. P/invokes을 래핑 한 후, 명명 된 파이프를 .NET 2.0 (3.5 System.Core 클래스의 look-alikes를 만들었습니다) 스트림으로 노출 할 수있게하려면 데이터 패킷을 어느 방향 으로든 보낼 수 있습니다 만약 당신이 Vista/7보다 제한적인 정책을 사용하기 위해 권한을 바로 설정할 수 있다면.

아마도 C# 응용 프로그램에서 Server 스트림을 사용하는 것이 좋을 것입니다. 네이티브 코드에서 클라이언트의 수많은 무언가 인스턴스를 사용하여 작업을 수행 할 가능성이 있습니다 (이전에 시작된 단일 인스턴스를 공유 할 수 있을지 잘 모르겠습니다. dll을 삽입하는 모든 프로세스와 연결되므로 여러 클라이언트가있을 것이라고 생각합니다.)

필자는 Vista/7 용 DLL 후킹을 포기했습니다.