2012-10-18 4 views
0

C#에서는 응용 프로그램 A가 (IAppB)Activator.CreateInstance(Type.GetTypeFromProgID('AppB')).CallMe()과 같은 응용 프로그램 핸들을 사용하여 응용 프로그램 B를 호출 할 때 응용 프로그램 A가 응용 프로그램 B에 전화를 어떻게 보냅니 까? 나는 하드웨어 계층 설명을 요구하지 않고, 어쨌든 응용 프로그램에 대한 메서드 호출을 캡처하여 그 정보를 엉망으로 만들 수 있는지 알아 내려고 노력 중이다.C에서 메서드 실행 작동

답변

1

사용법과 이름이 주어지면 out-of-process COM 서버에 대한 메서드 호출을 할 수 있습니다. 그것의 메 커닉은 책을 채울 수 있습니다 (많은 책들이 쓰여졌습니다).

공은 레지스트리에 저장된 구성 정보를 사용하여 COM 서버를 시작하여 롤링을 시작합니다. 기본 네이티브 API 호출은 CoCreateInstance()입니다. 그런 다음 COM 인프라는 다시 레지스트리를 사용하여 프록시와 스텁으로 작동하는 DLL을 찾습니다. 프록시의 작업은 사용중인 정확한 COM 인터페이스를 에뮬레이션하는 것입니다. 이 경우 CallClose() 메서드를 선언 한 coclass의 기본 인터페이스입니다.

프록시가 전달 된 인수를 직렬화하면 RPC를 호출하여 서버에 호출 요청을 내 보냅니다. 서버 끝에서 스텁은 클라이언트 코드로 작동합니다. 인수를 비 직렬화하여 실제 호출을 작성합니다. 호출 결과, 적어도 HRESULT 및 참조에 의해 전달되고 다시 복사해야하는 모든 인수가 호출을 완료하기 위해 프록시로 다시 이동합니다.

낮은 수준의 RPC 경계에서이 체계를 망친 것은 실용적이지 않습니다. 그러나 기술적으로 자신의 프록시와 스텁을 만들 수 있습니다. 심각한 장애물이 있으며, 일반적으로 MIDL 도구로 IDL 언어로 작성된 인터페이스 설명에서 자동 생성됩니다. 적어도 IDL이 필요하므로 인터페이스의 모양을 정확히 알 수 있습니다. 서버의 소스 코드를 거의 소유하지 않으므로 IDL이 없기 때문에 어려운 경향이 있습니다. 형식 라이브러리에 서버가있는 경우 형식 라이브러리를 역 컴파일 할 수 있습니다. 늦게 전화를 걸기 때문에 그럴 가능성은 희박합니다. 마지막으로, RPC를 꽤 잘 알아야합니다. 어려워, 너무 애매합니다.

0

여기에 여러 가지를 혼합하는

  • 응용 프로그램 호출 응용 프로그램 B - 모든 일반 전화에 - 이것은 일반적으로 '프로세스 A'호출 '프로세스 B'
  • C#을 방법 호출 방법 B를 의미 C#
  • COM 호출 COM (yr 코드 스 니펫이 수행하는 것)
  • 리플렉션 기법을 통해 호출. 귀하의 샘플에도 포함되어 있습니다

질문에 대한 답변은 귀하가 말하는 내용에 달려 있습니다.

당신은 단순히 AOP 들여다 같은 응용 프로그램 도메인에 기능 A와 기능 B 사이에 일반적으로 자신을 장소에서 찾고 있다면 - Aspect Oriented Programming in C#

또는 차단 http://www.codeproject.com/Articles/8436/Intercepting-method-calls-in-C-an-approach-to-AOSD

또는 성 동적 프록시를 보면 http://docs.castleproject.org/Default.aspx?Page=DynamicProxy