다음을 통해 공유


ITrackingHandler 인터페이스

정의

구현 개체가 원격 인프라에 의해 마샬링, 역마샬링 및 개체와 프록시의 연결 끊기에 대한 알림을 받아야 한다는 것을 나타냅니다.

public interface class ITrackingHandler
public interface ITrackingHandler
[System.Runtime.InteropServices.ComVisible(true)]
public interface ITrackingHandler
type ITrackingHandler = interface
[<System.Runtime.InteropServices.ComVisible(true)>]
type ITrackingHandler = interface
Public Interface ITrackingHandler
특성

예제

다음 코드 예제에는의 메서드를 구현 하는 방법을 보여 줍니다는 ITrackingHandler 인터페이스 원격 인프라에서 알림을 받을 수 있습니다.

다음 코드 예제에는이 인터페이스를 구현 하는 방법을 보여 줍니다.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Services;

// Intercept marshal, unmarshal, and disconnect events for an object.
public class TrackingHandler : ITrackingHandler
{
    // Called when the tracked object is marshaled.

    public void MarshaledObject(Object obj, ObjRef objRef)
    {
        // Notify the user of the marshal event.
        Console.WriteLine("Tracking: An instance of {0} was marshaled.", 
            obj.ToString());

        // Print the channel information.
        if (objRef.ChannelInfo != null)
        {
            // Iterate over ChannelData.
            foreach(object data in objRef.ChannelInfo.ChannelData)
            {
                if (data is ChannelDataStore)
                {
                    // Print the URIs from the ChannelDataStore objects.
                    string[] uris = ((ChannelDataStore)data).ChannelUris;
                    foreach(string uri in uris)
                        Console.WriteLine("ChannelUri: " + uri);
                }
            }
        }

        // Print the envoy information.
        if (objRef.EnvoyInfo != null)
            Console.WriteLine("EnvoyInfo: " + objRef.EnvoyInfo.ToString());

        // Print the type information.
        if (objRef.TypeInfo != null)
        {
            Console.WriteLine("TypeInfo: " + objRef.TypeInfo.ToString());
            Console.WriteLine("TypeName: " + objRef.TypeInfo.TypeName);
        }

        // Print the URI.
        if (objRef.URI != null)
            Console.WriteLine("URI: " + objRef.URI.ToString());
    }

    // Called when the tracked object is unmarshaled.
    public void UnmarshaledObject(Object obj, ObjRef objRef)
    {
        Console.WriteLine("Tracking: An instance of {0} was unmarshaled.", 
            obj.ToString());
    }

    // Called when the tracked object is disconnected.
    public void DisconnectedObject(Object obj)
    {
        Console.WriteLine("Tracking: An instance of {0} was disconnected.", 
            obj.ToString());
    }
}

다음 코드 예제에는 서버에서이 인터페이스를 구현 하는 방법을 보여 줍니다.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Services;

public class Server
{
    public static void Main(string[] args)
    {
        // Register the TCP channel.
        TcpChannel channel = new TcpChannel(1234);
        ChannelServices.RegisterChannel(channel);

        // Register a tracking handler.
        ITrackingHandler handler1 = new TrackingHandler();
        TrackingServices.RegisterTrackingHandler(handler1);

        // Register a second handler.
        ITrackingHandler handler2 = new TrackingHandler();
        TrackingServices.RegisterTrackingHandler(handler2);

        // Get the number of currently registered handlers.
        Console.WriteLine("Registered tracking handlers: " + 
            TrackingServices.RegisteredHandlers.Length);

        // Remove the tracking handler from the registered handlers.
        TrackingServices.UnregisterTrackingHandler(handler2);
        Console.WriteLine("Registered tracking handlers: " + 
            TrackingServices.RegisteredHandlers.Length);

        // Create and marshal an object for remote invocation.
        RemoteService service = new RemoteService();
        ObjRef obj = RemotingServices.Marshal(service, "TcpService");

        // Wait for the user prompt.
        Console.WriteLine("\r\nPress ENTER to unmarshal the object.");
        Console.ReadLine();

        // Unmarshal the object.
        RemotingServices.Unmarshal(obj);

        // Wait for the user prompt.
        Console.WriteLine("Press ENTER to disconnect the object.");
        Console.ReadLine();

        // Disconnect the object.
        RemotingServices.Disconnect(service);
    }
}

다음 코드 예제에서는 앞의 코드 예제에서 서버에 대 한 클라이언트에서이 인터페이스를 구현 하는 방법을 보여 줍니다.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

public class Client
{
    public static void Main(string[] args)
    {
        // Register the TCP channel.
        ChannelServices.RegisterChannel(new TcpChannel());

        // Register the client for the remote object.
        WellKnownClientTypeEntry remoteType = new WellKnownClientTypeEntry(
            typeof(RemoteService),"tcp://localhost:1234/TcpService");
        RemotingConfiguration.RegisterWellKnownClientType(remoteType);

        // Create an instance of the remote object.
        RemoteService service = new RemoteService(); 

        // Invoke a method on the remote object.
        service.Hello("world");
        Console.WriteLine("Hello invoked on server.");
    }
}

다음 코드 예제는 서버와 클라이언트에서 사용 되는 원격 개체를 보여 줍니다.

using System;

// Remote object.
public class RemoteService : MarshalByRefObject
{
    private DateTime startTime;

    public RemoteService()
    {
        // Notify the user that the constructor was invoked.
        Console.WriteLine("Constructor invoked.");
        startTime = DateTime.Now;
    }

    ~RemoteService()
    {
        // Notify the user that the finalizer was invoked.
        TimeSpan elapsedTime = 
            new TimeSpan(DateTime.Now.Ticks - startTime.Ticks);
        Console.WriteLine("Finalizer invoked after " + 
            elapsedTime.ToString() + " seconds.");
    }

    public void Hello(string name)
    {
        // Print a simple message.
        Console.WriteLine("Hello, " + name);
    }
}

설명

등록 된 모든 개체 TrackingServices 개체나 현재에서 프록시 하는 경우 원격으로 호출 됩니다 AppDomain 마샬링, 역마샬링을 또는 연결이 끊어진 됩니다.

개체만 끊을 수 있습니다. 때 예외가 throw 연결 끊기 프록시에서 라고 합니다.

참고

이 인터페이스에는 링크 요청을 만듭니다. SecurityException 직접 실행 호출자 인터페이스에 대 한 참조를 통해 호출 하 고 인프라 권한이 없는 경우 throw 됩니다. 참조 링크 요구가 자세한 내용은 합니다.

메서드

DisconnectedObject(Object)

프록시에서 연결이 끊어진 개체의 현재 인스턴스를 알려 줍니다.

MarshaledObject(Object, ObjRef)

마샬링된 개체의 현재 인스턴스를 알려 줍니다.

UnmarshaledObject(Object, ObjRef)

역마샬링된 개체의 현재 인스턴스를 알려 줍니다.

적용 대상