2010-05-10 8 views
0

간단한 .NET Remoting Client/Server (Code Below)라고 생각했던 것이 있습니다 ... 콘솔 응용 프로그램에서 호스팅/실행할 때 제대로 작동하지만 호스팅 할 때 Windows 서비스에서 Activator.GetObject에서 반환 된 프록시 멤버에 대한 모든 호출은 NullReferenceException을 발생시킵니다.Windows 서비스에서 호스팅 할 때 원격 객체 구성원에 액세스 할 수 없습니다.

단순화하기 위해이 모든 것을 하나의 콘솔에두고 잘 작동했습니다 ... 기본 Windows 서비스를 만들고 OnStart 메서드에 동일한 코드를 배치하고 "TheString"속성에 액세스하면 NullReferenceException이 발생합니다.

다른 예외가없고 포트를 사용할 수 있으며 서비스가 관리자 권한으로 실행되는지 확인할 수 있습니다. 또한, 내 솔루션은 왜 내가 그것을 사용하는 싱글 톤이 필요합니다.

현재이 요소는 Windows 7에서 호스팅되고 있습니다. 기본 오류가 원인 일 수있는 방법을 더 배우는 방법을 배울 수 있다면 알아낼 수 있습니다. 아래에서 일어날 수있는 일을 어떻게 볼 수 있습니까 (예 : 싱크대, 포맷터 등)?

서버 코드 :

var provider = new BinaryServerFormatterSinkProvider 
{ 
    TypeFilterLevel = TypeFilterLevel.Full 
}; 

IDictionary properties = new Hashtable(); 
properties["port"] = 20001; 
properties["exclusiveAddressUse"] = false; 

_channel = new TcpChannel(properties, null, provider); 

ChannelServices.RegisterChannel(_channel, false); 

RemotingConfiguration.RegisterWellKnownServiceType(typeof(HostClass), "TheHost", WellKnownObjectMode.Singleton); 

클라이언트 코드 :

var retInstance = (HostClass)Activator.GetObject(typeof(HostClass), 
    string.Format("tcp://{0}:{1}/TheHost", "MyHostName", 20001)); 

string host = retInstance.TheString; //This is where the NullReference is experienced 

원격 개체 :

public class HostClass : MarshalByRefObject, IHostClass 
{ 
    public HostClass() 
    { 
     TheString = "Hello World"; 
    } 

    public override object InitializeLifetimeService() 
    { 
     return null; 
    } 

    public string TheString { get; set; } 
} 

어떤 아이디어 감사하겠습니다.

답변

0

제한 사항은 원격 엔진이 직렬화 및 프록시 인터페이스 유형을 사용할 수 없다는 것으로 밝혀졌지만 내 샘플 (미안)의 일부는 궁극적으로 문제의 근원 이었지만 그렇지 못했습니다.

+0

나는 비슷한 문제가있다. 그 해결책이나 해결 방법은 무엇인가? –

+0

비 추상적 유형을 사용하도록 전환했습니다. – JoeGeeky

관련 문제