2010-04-27 2 views
47

.NET에는 별도의 appdomain 또는 물리적 컴퓨터 사이에서 객체를 전달할 수있는 remoting이라는 것이 있습니다. 나는 마술이 어떻게 이루어 졌는지 완전히 이해하지 못한다. 그러므로이 질문을한다.MarshalByRefObject가 특별합니까?

리모컨에는 객체를 전달하는 두 가지 기본 방법이 있습니다. 직렬화 (한 묶음으로 변환하고 다른 끝에 재구성)하거나 MarshalByRefObject에서 상속 할 수 있습니다.이 경우 .NET에서는 일부를 만듭니다. 투명한 프록시와 모든 메소드 호출은 원래 인스턴스로 다시 전달됩니다.

이것은 매우 시원하고 마술처럼 작동합니다. 그리고 나는 프로그래밍에있어서 마술을 좋아하지 않는다. Reflector로 MarshalByRefObject을 보면 다른 일반적인 물체와 구별되는 것을 볼 수 없습니다. 이상한 내부 속성이나 아무것도 없습니다. 그렇다면 전체 투명 프록시는 어떻게 구성되어 있습니까? 그런 메커니즘을 직접 만들 수 있습니까? MarshalByRefObject에서 상속받지 못했지만 여전히 동일한 역할을 수행 할 수있는 대체 MyMarshalByRefObject을 만들 수 있습니까? 또는 MarshalByRefObject은 .NET 엔진 자체에서 일부 특별한 대우를 받고 있으며 전체 리모팅 업적은 단순한 필사자가 아닌 이중화가 가능합니까?

+1

.NET Remoting이 MarshalByRefObject를 상속 한 모든 클래스를 특별한 방식으로 처리하는 경우 "MarshalByRefObject is special"자격을 갖습니까? Reflector를 .NET Remoting에서 사용하고 마법을 찾으십시오. BTW, .NET Remoting은 MarshalByRefObject와 함께 더 이상 사용되지 않습니다. 물론 사용할 수 있지만 WCF는 현재 .NET에서 "원격 아키텍처"가 가장 많이 사용됩니다. –

+1

WCF는 여전히 MarshalByRefObject를 지원합니다. – Schneider

+7

마법은 지터에 있으며, MBRO 클래스를 특별하게 취급합니다. 더 이상 클래스의 필드에 직접 액세스하지 않지만 대신 CLR 도우미 메서드를 사용하는 코드를 생성합니다. 어떤 객체가 리모콘인지 알고 있으므로 프록시 호출을 생성 할시기를 알고 있습니다. –

답변

17

마법은 특별한 TransparentProxy 클래스에있는 것처럼 보입니다. .NET 런타임은 특수한 방식으로 처리합니다. 당신이 그것을 사용하려는 경우

을 나는 MarshalByRefObject이 메커니즘에 대한 도움이 될 수있는 몇 가지 추가적인 내부 정보를 포함 할 수 있다고 생각, 하지만 나는 그것에 대해별로 보지 않았습니다.

+0

RealProxy에 관한 기사가 깨졌습니다 (또는 적어도 * 개인 *) –

+1

정보 주셔서 감사합니다. 나도 그렇게 생각합니다 :-(불행히도, 나는 web.archive.org에서도 찾을 수 없습니다. thomas-danecker가 개인적으로 어떻게 든 도움이 될 수 있습니다. – akavel

+0

MarshalByRefObject와 파생 된 클래스는 ValueTypes가 특별합니다. JIT는 MarshalByRefObject를 사용할 때 코드 생성을 일부 변경하고 특정 최적화를 비활성화합니다. .MarshalByRefObject에서 파생 된 모든 개체 'x'에 대한 참조가있는 경우 JIT는 x가 원격 개체에 대한 TransparentProxy 일 가능성을 항상 고려해야합니다. 예를 들어 인라인은 사용하지 않도록 설정하거나 검사 여부를 테스트하여 'x'는 로컬 또는 원격입니다. – Qwertie

4

MarshalByRefObject가 그다지 특별하지 않다고 생각합니다. 나는 존재의 모든 이유가 수명 관리와 서버에서 어떻게 가비지 수집되는지에 달려 있다고 믿습니다. 이 내용은 LifetimeServices 클래스 문서에 대한 좋은 설명이 있습니다.

AFAIK를 사용하면 호스트를 설정할 때 원격 관리의 실질적인 마술을 수행 할 수 있습니다. MarshalByRefObject는 AppDomains에서 마샬링하는 실제 작업을 수행하지 않습니다.

+1

필자의 경우, AppDomain 경계를 넘어서 통신 할 필요가 있습니다 (관리되는 .DLL을 언로드해야하기 때문에). Remoting은 사용하기가 쉽기 때문에 매력적입니다. –

+0

어쨌든 MarshalByRefObject가 전체 프로세스의 핵심이 아니라면 무엇입니까? 신비한 프록시를 정확하게 만드는 것은 무엇입니까? –

+0

RemotingConfiguration.RegisterWellKnownServiceType()을 살펴보십시오.2 년 전에 WCF로 전환했기 때문에 Remoting에 관한 모든 것을 잊어 버렸기 때문에 나는 그것을 조사해야했습니다. WCF는 원하는 모든 것을 할 수 있습니다. 더 많은 리소스를 찾을 수 있습니다. 나는 그의 결정에 대해 아이에게 경고하는 "그렘린 (Gremlins)"의 늙은 중국인처럼 느껴진다. 그러나 아이는 계속 나아가서 어쨌든 그 일을 먹는다. –