2011-10-04 9 views
2

저는 시스템과 같은 플러그인 샌드 박스를 갖고 싶은 프로젝트에서 작업하고 있지만 양방향 실시간 크로스 프로세스 통신 작업에 문제가 있습니다. 처음에는 객체 메타 데이터를 전달할 수있는 WCF를 생각했지만 곧 WCF의 서비스 클라이언트 모델이 문제를 제기한다는 것을 깨달았습니다. 그러나 내가 여기에 내 모든 아이디어와 질문을 내려 놓기 전에 내가 계획 한 것이 있습니다.양방향 교차 프로세스 통신

대부분의 작업을 수행 할 호스트 응용 프로그램을 갖고 싶습니다.이 host.exe를 호출하게하고 host.exe는 프로그램의 기본 응용 프로그램 논리를 호스트하고 실행, 실행 및 종료합니다. 플러그인. 플러그인은 MEF를 통해 호스팅되는 플러그인 프록시를 통해 호스팅되므로 proxy.exe라고합니다. proxy.exe는 플러그인 dll을로드하고 오류를 격리 할 수있는 외딴 환경에서 호스트합니다. 플러그인이 실패하면 프록시가 아닌 응용 프로그램이 종료됩니다. 호스트와 프록시는 양방향으로 실시간으로 통신해야하며 여러 프록시 호스트가 있기 때문에 객체 데이터를 전달할 수있는 것이 가장 좋습니다.

그래서 내가 원하는 것의 기본 아이디어입니다. 나는 이것을 할 여러 가지 방법을 생각하고 있었다. 첫 번째 WCF인데, 나는 WCF가 작동하는 방식이 서비스 서버가 클라이언트에게 요청/명령을 보내는 것이 불가능하지 않더라도 어렵지 않을 것이라고 생각했습니다. TCP를 사용하는 다음 아이디어, 그리고 호스트가 TCP 서버가되고 의사 소통하는 데 사용할 수있는 메시징 프로토콜을 개발해야하지만 WCF 메타 데이터의 고급 스러움이없고 복잡한 클래스 정보를 전달할 수 없으므로 문제가 될 수 있습니다. 바로 미쳐야한다.

모든 연구를 통해 문제가 발생한 후 문제가 떠올랐다. 누구든지이 문제에 대한 해결책을 제시 할 수 있다면 많은 도움이 될 것입니다. 고맙습니다.

+0

우리가 어떻게 도와 드릴까요? 정말로 몇 가지 코드 샘플을 사용하여 문제를 해결할 수 있다고 생각하십니까? –

+0

IPC에 대해 이야기하고 있습니까? 그런 다음 WCF가 필요 없으며 WCF는 실시간 프로세스 간 통신 서비스가 아니며 실시간 IPC 기반 클라이언트 - 서버 기술을 사용합니다. –

+0

@Artur Mustafin, 나는 지금까지 내가 계획 한 것에 대한 아이디어와 피드백을 원했다. 그리고 네, WCF가 실시간이 아니라는 것을 압니다. 그것은 내가보고 있었던 선택이었다. 비록 내가 코드를 가지고 있지는 않지만, 나는 단지 코드와 아이디어와 피드백을 원하지 않는다. – p1p3l1n3

답변

0

내 솔루션이 원격 일 가능성이 높습니다. 나는 WCF가 이것을 동일한 방법으로하는지 모른다. 리모팅은 텍스트로 구성 될 수 있으며 서버는 원하는대로 객체에 원격으로 설치 될 수 있습니다.

경고를 전하고 싶습니다. 내가 언급 한 프로젝트는 꽤 오래 전부터 나온 것입니다. (WCF가 똑같은 일을 할 수도 있고하지 않을 수도 있습니다. 우리 회사에서 WCF 작업이 필요하지 않습니다.)

클라이언트에서 서버로. 나는 (실제로는 별도의 컴퓨터에서) 서버를 실행 한 다음 tcp remoting을 사용하여 원하는 모든 객체가 해당 응용 프로그램에 선언됩니다.

이제 재미있는 부분이 있습니다. 원격 개체는 원격이 아닌 대리자 개체를 사용했습니다. 나는 (원격) 개체를 초기화하고 서버가 그것을 만들 것이다. 그런 다음 다른 (인터페이스 유형 지정) 객체를 초기화하고 원격 객체에 연결합니다.

원격 객체가 나와 통신하기를 원하면 직렬화 가능 정보를 나에게 보내면 더 많은 객체 나 명령으로 구성 할 수 있습니다. 필요한 것은 무엇이든지 ... (아마도 더 먼 물체)

하나의 서버와 여러 개의 원격 객체가 CommonInterface.dll에 모든 표준 인터페이스 객체가 정의 된 상태로 앞뒤로 전송됩니다.

이것은 내 서버에서 정보를 얻고 자하는 모든 응용 프로그램이 인터페이스가 일치하는 한 해당 클래스를 구현하고 처리 할 수있는 블라인드 플러그인 설정입니다. (직렬화 가능한 명령 데이터 사용)

플러그인 (클라이언트)이 손상되면 응용 프로그램 (서버)이 작동하지 않아도됩니다. try catch에서 해당 통신에 대한 모든 통신을 래핑하고 원격 객체는 일종의 라이브 또는 핑 스타일 해제 메커니즘을 가질 수 있습니다.

나는 당신의 시나리오가 샌드 박싱과 같을 것이라는 것을 정말로 알지 못하지만, 당신이 묻고있는 것을 성취 할 수 있습니다.

여기에 .net 원격 채팅 서버가 있습니다.

http://www.codeproject.com/KB/IP/dotnetchatapplication.aspx

이것은 내가 원격 내 처음 건설 프로젝트의 동일한 유형이다. 그리고 그것을 내 서버 플러그인 아키텍처로 발전 시켰습니다. 내 용도와 내 용도의 차이점은 서버가 내 클라이언트 였고 서버를 사용하는 주 응용 프로그램이었고 서버가 여러 응용 프로그램이 플러그인을 허용하는 주 응용 프로그램이된다는 것입니다.

+1

Remoting은 WCF를 위해 더 이상 사용되지 않습니다. –

+0

고마워요.이 생각은 내가 생각했던 것과 비슷합니다. 작동하는 것처럼 보입니다. 난 그냥 방법을 내가 그것을 처리 할 수있는 방법으로 정보를 serialize하는 방법을 해결할 필요가 인스턴트 메신저, 정말 고마워요! – p1p3l1n3

0

필자는 다른 애플리케이션 도메인, 인터페이스를 사용하는 플러그인과의 통신 및 실제 프록시 객체 참조를 사용한다고 조언합니다. 다른 프로세스를 사용하지 마십시오. 응용 프로그램 도메인 격리를 통해 플러그인 격리를 달성 할 수 있습니다. 예외가 지정되지 않은 한 응용 프로그램 도메인 경계를 넘지 않기 때문입니다.

대신 .NET Remoting과 같이 비표준 기술을 사용하여 통합 마샬링 및 투명한 프록시 개체 생성을 수행 할 수 있습니다. 제 생각에는

는, WCF는 너무 무겁고 너무 멀리 실시간 처리

+0

예, AppDomains를 살펴 보았지만 로딩과 언 로딩은 문제가되는 것처럼 보였습니다. 가치가 있었고 응용 프로그램에 대한 참조가 실제로 수집되지 않았습니다. 그래서 어디에 새로운 객체를로드하여 언로드했는지 알 수 없으면, 실제로 언로드되지 않습니다. – p1p3l1n3

+0

플러그인이 만든 스레드에서 예외가 발생하면 해당 응용 프로그램 도메인이 충돌하고 .NET은 모든 응용 프로그램 도메인 충돌시 전체 프로세스를 종료합니다. 그와 같은 주인도 살해 당한다. 플러그인을 사용하여 사이드 스레드에서 처리되지 않은 예외를 방지하려면 프로세스 격리가 필요합니다. –

0

프로세스 간 통신 (IPC)에서이다. CPC (cross-process communication)라고하는 것은 알려진 MS/Windows 전용 개념입니다. 내가 RPC와 (대형 데이터 세트를 전송하기 위해 SQL 서버에서도 사용/결과) 윈도우 파이프

당신은 항상 다른 방법을 시도 할 수 있습니다를 사용했습니다 그것은 과거 here

에 대해

더 통신, WCF, 소켓, Pub/Sub Messaging; 예를 들어, TibcoRv (로컬에서는 소켓을 우회). 나는 이것들이 약간의 과잉이라고 생각한다. 그러나 당신의 필요 조건을 위해 완전 할 수 있었다.