2014-03-31 2 views
0

나는 여러 AppDomains로 응용 프로그램을 구현 중입니다. 대부분의 상호 도메인 통신은 이벤트 메커니즘을 사용하여 수행됩니다. EventArgs 클래스에 setter 속성이 포함 된 이벤트를 제외하면 모든 것이 잘 작동합니다. 여기에있는 EventArgs 클래스의 예는 다음과 같습니다크로스 AppDomain "취소 가능"이벤트

[Serializable] 
public class CancelableEventArgs : EventArgs 
{ 
    public bool Cancel { get; set; } 
} 

이벤트가 성공적으로 발사되고,하지만 두 번째 응용 프로그램 도메인 (가입자)의 취소 속성을 설정하면, 그것은 이벤트 실행 후 첫 번째 응용 프로그램 도메인 (출판사)에 다시 유지되지 않습니다 끝. 이 동작은 의도적으로 설계 되었습니까? 아니면 뭔가 빠졌습니까?

답변

0

AppDomains간에 전달할 수있는 개체에는 serializable과 MarshalByRefObject의 두 가지 종류가 있습니다.

게시물의 EventArg와 같은 직렬화 가능한 개체는 하나의 AppDomain에서 직렬화되어 개체를 나타내는 일부 바이트로 직렬화되며 다른 AppDomain에서는 deserialize됩니다. 즉, 다른 AppDomain은 복사본 원본 개체를받습니다.

게다가 MarshalByRefObject를 상속하는 개체는 (참조 번호)을 AppDomain으로 전달할 수 있습니다. 개체를 직렬화 가능하게 만드는 대신 MarshalByRefObject를 상속하면 문제가 해결 될 수 있습니다.

0

아직도이 일을 더 좋은 방법이 좋겠지 만 이것은 내가 사용하고 해결 방법입니다 : 어떻게 작동하는지 나는 아주 완벽하게 이해하지

[Serializable] 
public class CancelableEventArgs : EventArgs 
{ 
    public MarshalByRefWrapper<bool> Cancel { get; set; } 
} 

public class MarshalByRefWrapper<T> : MarshalByRefObject 
{ 
    public T Value { get; set; } 
} 
0

. 그러나 두 항목이 있습니다 :

  1. 상속 MarshalByRefObject에서 (십자가의 도메인() 이벤트 핸들러에 대한) EventArgs입니다 나를

에 대한

  • 암시 운영자는 그러한 TypedDataSet와 같은 데이터를 전송하기 위해 설정 문자열

    public class MyEventArgs : MarshalByRefWrapper<EventArgs> 
    { 
        public DataTable SystemState { get; set; } 
        public string SystemString { get; set; } 
    } 
    
    public class MarshalByRefWrapper<T> : MarshalByRefObject 
    { 
        public MarshalByRefWrapper() 
        { 
    
        } 
    
        public MarshalByRefWrapper(T value) 
        { 
         Value = value; 
        } 
    
        public T Value { get; set; } 
    
        public static implicit operator MarshalByRefWrapper<T>(T value) 
        { 
         return new MarshalByRefWrapper<T>(value); 
        } 
    } 
    
  • +1

    코드가 아니라 답변에 대한 설명을 추가하십시오. –