2014-10-08 5 views
-1

RPC를 통해 .NET 컴파일 된 어셈블리에 액세스하려고합니다 (호출 코드는 Python이지만 실제로는 관련이 없습니다).C#에서 (자신의 클래스가 아닌) 컴파일 된 어셈블리를 호출하는 데 사용할 수있는 RPC 기술은 무엇입니까?

어셈블리는 실행중인 타사 응용 프로그램 (예 : 오토 데스크의 AutoCAD)에 대한 API를 나타냅니다. API 객체를 포함하는 정적 클래스를 포함하는 여러 네임 스페이스가 포함되어 있습니다. 객체 계층 구조에서 모든 종류의 항목에 액세스해야합니다. IDisposable 인터페이스를 사용하는 속성, 객체, 메서드 및 아마도 가장 복잡한 트랜잭션 (기본적으로 상태, 즉 개체 저장소가 RPC 호출간에 유지되어야 함을 의미합니다).

오히려 (ZeroMQ 메시징 및 반사 기반의 콜 파견을 사용) 내 자신의 솔루션을 개발하기 위해 계속보다, 나는 RPC 기술이 내 요구에 맞게 될지 궁금합니다.

나는 JSON-RPC와 SOAP을 구현하는 인기있는 라이브러리의 기본 예제로 보았다. 나는 당신이 그들의 기본 클래스에서 호출 클래스를 상속 클래스 선언에 속성을 넣어이 라이브러리는 RPC가 작동하려면 예를

[SoapMethod("RequestResponseMethod")] 

에 대한 요구 것을 알 수있다. 외부 사전 컴파일 된 어셈블리의 경우에는 분명히이를 수행 할 수 없습니다.

JSONRPC 또는 SOAP이 내가 설명한 작업에 대한 잘못된 선택인지 또는 실제로 알지 못하는 외부 어셈블리에서 RPC 작업을 수행 할 수있는 방법인지 알고 싶습니다. 나는 기존의 RPC 기술 중 하나를 사용하여 경험이 없기 때문에

모든 지침, 의견이나 기본적인 조언을 많이 주시면 감사하겠습니다. 당신이 JSON/SOAP에 대해 이야기하는 경우

+0

Windows 서비스로 호스팅 하시겠습니까? –

+0

이것이 어떻게 문제에 대한 해결책을 제공할지 모르겠습니다. 참조를 공유하는 데주의해야합니까? –

답변

1

난 당신이 비 저장입니다 HTTP를 사용하는 것 같아요 => 당신은 "상태 변수"어떤 종류의를 제공해야합니다. 이것은 예를 들면 다음과 같이 행해질 수있다. 내 examle에서 쿠키 나 같은 : 이것은 당신에게 시작을 주어야한다

public class MyApiAccess : IMyApiService 
{ 
    private static Dictionary<int, MyAPI> apiInstances = new Dictionary<int, MyAPI>(); 

    public int StartSession() 
    { 
     var api = new MyAPI(); 
     int id = api.Id; // or some other way to get an unique id 
     apiInstances.Add(id, api); 
     return id; 
    } 
    public void EndSession(int sessionId) 
    { 
     // ensure "sessionId" is valid 
     var api = apiInstances[sessionId]; 
     api.Dispose(); 
     apiInstances.Remove(api); 
    } 

    public MyType MyMethod(myParameter param) 
    { 
     // ensure "sessionId" is valid 
     var api = apiInstances[sessionId]; 
     return api.MyMethod(param); 
    } 
} 

:

는 외부 API는 (WCF 또는 "오래된 학교 웹 서비스를"사용) "래퍼 서비스"를 만들에 액세스하려면 그러한 서비스가 어떻게 구현 될 수 있는지를 지적하십시오.

+0

답변 해 주셔서 감사합니다. 지금 웹 소켓을 사용 중이며 HTTP를 사용할 수있는 옵션을 연구 중입니다. 수송은이 점에서 정말로 중요하지 않다. 래퍼 서비스는 내가 피하려고 노력하는 것처럼 보입니다. 왜냐하면 필자가 원하는대로 타겟 API에서 모든 속성과 메서드를 래핑해야한다는 것을 의미하기 때문입니다. –

+1

'래퍼 서비스는 내가 피하려고 노력하는 것처럼 보입니다. 왜냐하면 저는 여러분의 예제를 올바르게 읽으면 목표 API에서 모든 속성과 메소드를 포장해야한다는 것을 의미합니다. 그렇습니다. 그렇지만 IMO는 만약 당신이 외부 API를 사용한다면, 그 주위에는 방법이 없습니다 ... – ChrFin

+0

글쎄, 내가 이것을하는 현재의 방식은 반성과 관련이 있습니다. 수신 코드에서 호출 할 수 있도록하려는 정적 클래스 사전이 있습니다. 그런 다음 들어오는 RPC 메시지에있는 문자열을 구문 분석하여 외부 API에 대한 호출을 호출합니다. 그렇게하면 래퍼 작성을 피할 수 있습니다. –