2012-11-21 5 views
4

동일한 컴퓨터에있는 두 개의 간단한 프로그램간에 원격 채널을 설정하려면 RemotingServices.MarshalActivator.GetObject을 사용하고 있습니다..NET Remoting에서 원격으로 목록을 원격으로 볼 수없는 이유는 무엇입니까?

public class IpcInterface : MarshalByRefObject 
{ 
    public int number = -1; 
    public string text = "default"; 
    public List<String> strings; 
} 
// A simplification 

나는 두 프로그램이 성공적으로 numbertext이 완전히 고유 한 값이 (확인)을 변경하기 때문에, 채널이 존재하고 통신이 가능하다는 것을 확인했습니다.

그래서 나는 즉시 strings에 대해 동일한 작업을 시도했습니다.

하나의 프로그램에서 나는 strings.Add("1")을 호출했습니다. 두 번째 프로그램에서 strings의 내용을 읽으려고했습니다. 비어 있습니다.입니다. 더 많은 것은 무엇인지, 조사는 0이었다. 에 계속 0 개의 오브젝트가있는 이유를 모르겠다. Stack<T>Dictionary<T, K>에 대해서도 같은 일이 발생하지만, 어떤 요소도 추가 할 수 없습니다. 일반적으로 참조 유형을 사용하여 이상한 일이 발생하지 않았는지 확인하기 위해 IPC 인터페이스 클래스에 StringBuilder을 넣으려고 시도했으며 '상태'가 두 프로그램에서 값을 변경하여 성공적으로 유지 관리되었습니다.

질문 : 문자열 목록이 추가되지 않는 이유는 무엇이며 해결책은 무엇입니까?

나는 경험이있는 사람이 바로이 문제를 발견 할 수 있기를 바랍니다. 비슷한 질문에 대해 인터넷 검색을 시도했지만 유용한 결과를 얻지 못했습니다. 놀랍게도 나는 단지 "디버깅 .net 원격 투명한 프록시"인터넷 검색을위한 1 개의 좋은 링크가 있습니다. 그것은 두 번째 질문이기도합니다. 투명한 프록시 객체를 어떻게 디버깅 할 수 있습니까?

  1. 모든 개체가 올바르게 인스턴스화됩니다 (NullReferenceException은 없으며 사실 예외가 없음).

답변

8

List<T> 자체는 MarshalByRefObject이 아니며 직렬화 가능 클래스입니다. 목록에서 Add() 메서드를 호출하면 실제로 수행중인 작업은 원격 객체에 목록을 serialize하고 로컬로 deserialize 한 다음 로컬 객체에서 메서드를 호출하도록 요청하는 것입니다. 변경 사항은 목록 객체의 원격 인스턴스로 다시 전파되지 않습니다.

IpcInterface 클래스의 메소드를 제공하여 목록을 조작해야합니다. 이 형식은 MarshalByRefObject에서 상속되므로 메서드는 로컬로 deserialize 된 인스턴스 대신 원격 개체에서 호출됩니다.

public class IpcInterface : MarshalByRefObject { 
    public List<String> strings; 

    public void Add(string value) { 
     strings.Add(value); 
    } 
} 

또한 그렇지 않으면 당신은 그것을 직접 조작 할 수 있다는 인상을주고있어, 읽기 전용 컬렉션으로 strings를 노출 할 수 있습니다 (이 그것을 할 수 없습니다).

+3

거룩한 *** 감사합니다. – Jason