2010-07-29 33 views
0

저는 현재 서로 통신해야하는 2 개의 .NET 응용 프로그램을 만들고 있습니다. 간단한 Windows 메시징이 선택되었으며 현재이 기능이 잘 작동합니다. 메시지에서 보내는 데이터는 간단한 문자열이지만 명령 (열거 형)과 데이터 (문자열) 멤버를 포함하는 메시지 클래스와 나중에 가능한 다른 멤버를 만들었습니다.IPC : WM_COPYDATA + serialization/deserialization

이러한 메시지 클래스의 인스턴스를 보내면 바이트로 직렬화 된 다음 base64 문자열로 변환됩니다. 이것은 Windows의 SendMessage()를 사용하여 전송됩니다. 반대편에서 나는 그 반대입니다. 결국 원래 객체가 복원되어 다른 응용 프로그램에서 사용할 수 있습니다.

이 메커니즘이 작동하는 것처럼 보이지만, 이것이 안전한 지 궁금합니다. 실제로 약간의 오버 헤드가 있습니다. base64 문자열은 원래 문자열 솔루션보다 훨씬 길지만 (명령 및 데이터 부분을 가져 오기 위해 수동으로 구문 분석해야합니다) SendMessage와 함께 보낼 수있는 메시지의 최대 크기가 있습니까?

또한 저는이 프로젝트에서 .NET Remoting을 사용하지 않고 SendMessage 솔루션을 유지하려고합니다.

아이디어가 있으십니까? 아마 오버 헤드를 제한하기 위해 JSON을 대신 사용할 수 있을까요?

감사합니다. 새앙 토끼

+1

이것은 내 눈에 눈물을 가져다 준 "오래된 학교"입니다. –

+1

눈물이 흘러 들어 왔지만 눈물이 나지 않았습니다. –

답변

1

사용 XDMessaging (http://xdmessaging.codeplex.com/) WM_COPYDATA를 지원하는 명명 된 파이프 및 IOStream 메시징 - 무언가 압연하는 대신 매우 유연하고 강력하며 검증 된 솔루션을 제공합니다.

XDMessaging을 사용하는 클래스에서 이진 직렬화 (http://msdn.microsoft.com/en-us/library/4abbf6k0(v=VS.71).aspx)를 사용하는 것은 어떻습니까? 그것은 매우 작고 구현하기가 매우 쉽습니다.

+0

후드에서 이미 XDMessaging을 사용하고 있습니다. 정말로 잘 작동하지만 문자열 만 보낼 수 있습니다.[Serializable] 및 BinaryFormatter를 사용하면 사용하고있는 메서드보다 긴 바이트 배열을 얻을 수 있지만 둘 다 작동합니다. –

+0

보이는 것처럼, 내가 사용하고있는 aproach는 올바르게 deserialize하지 않은 객체를 생성합니다. 나는 당신이 묘사 한 방법을 사용했고 이것이 올바르게 작동합니다. 감사! –

+0

라이브러리는 이제 직렬화 가능 객체의 전송을 지원합니다. – TheCodeKing

0

그냥 메시지를 전송해야하는 경우

Rhino Service Bus 또는 NServiceBus 같은 메시지 버스 아키텍처 봐. 비교적 간단하고 훨씬 강력한 메시징 구현을 제공합니다.

+0

흥미 롭지 만 지금은 같은 컴퓨터에서만 IPC가 필요합니다. –

+0

메시지 버스 시스템은 동일한 시스템의 두 프로세스간에 작동합니다. 나중에 두 대의 기계 사이에서 작업해야하는 경우 변경 사항은 "간단히"입니다. –

0

더 현대적이고 확장 가능한 접근 방식을 사용하는 것이 좋습니다. 예를 들어 named pipes을 사용하여 쉽게 통신하고 인코딩해야하는 메시지를 보내지 않고 표준 스트림 기능 만 사용할 수 있습니다.

(개인적으로, 나는 아마이 무료로 다른 컴퓨터에서 작동 할 수 있도록 포함한 많은 장점을 가지고로, WCF를 사용하는 거라고 ...)

+0

사실, 문제는 .NET 2.0 Framework를 사용해야한다는 것입니다. 나는 그러나 나중에 명명 된 파이프를 들여다 볼 수 있습니다. –

+0

@ pika81 : 솔루션을 찾은 것 같지만, 그렇지 않다면 .net 2에 대한 명명 된 파이프 지원을 제공하는 것을 고려해 볼 수 있습니다. http://www.switchonthecode.com/tutorials/interprocess- communication-using-pipes-in-csharp –

+0

Thx, 나는 또한이 매우 유용한 게시물을 발견했다 : http://blog.benday.com/archive/2008/06/22/23182.aspx –