In a call to the RealProxy base constructor, you pass the Type of the target object to be proxied. What I would like to do is dynamically add interfaces to the proxied type so that the resultant proxied type can be cast to the additional interfaces.
For example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
namespace ConsoleApplication17
{
    class Program
    {
        static void Main(string[] args)
        {
            MyProxy<IFoo> proxy = new MyProxy<IFoo>(new Foo());
            IFoo proxiedFoo = (IFoo)proxy.GetTransparentProxy();
            // make a proxied call...
            proxiedFoo.DoSomething();
            // cast proxiedFoo to IDisposable and dispose of it...
            IDisposable disposableFoo = proxiedFoo as IDisposable;
            // disposableFoo is null at this point.
            disposableFoo.Dispose();
        }
    }
}
public interface IFoo
{
    void DoSomething();
}
public class Foo : IFoo, IDisposable
{
    #region IFoo Members
    public void DoSomething()
    {
        //
    }
    #endregion
    #region IDisposable Members
    public void Dispose()
    {
        // dispose
    }
    #endregion
}
public class MyProxy<T> : RealProxy where T : class
{
    private T _target;
    public MyProxy(T target) :
        base(CombineType(typeof(T), typeof(IDisposable)))
    {
        this._target = target;
    }
    private static Type CombineType(Type type1, Type type2)
    {
        // How to implement this method, Reflection.Emit????
        throw new NotImplementedException();
    }
    public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg)
    {
        return InvokeRemoteCall((IMethodCallMessage)msg, this._target);
    }
    /// <summary>
    /// Invokes the remote call.
    /// </summary>
    /// <param name="methodCall">The method call.</param>
    /// <param name="target">The target.</param>
    /// <returns>A <see cref="ReturnMessage"/></returns>
    private static IMessage InvokeRemoteCall(IMethodCallMessage methodCall, object target)
    {
        MethodInfo method = methodCall.MethodBase as MethodInfo;
        object callResult = (target != null) ? method.Invoke(target, methodCall.InArgs) : null;
        LogicalCallContext context = methodCall.LogicalCallContext;
        var query = method.GetParameters().Where(param => ((ParameterInfo)param).IsOut);
        ParameterInfo[] outParameters = query.ToArray();
        return new ReturnMessage(callResult, outParameters, outParameters.Count(), context, methodCall);
    }
}
}
So in order to be able cast the proxied type to IDisposable, I need to be able to send IDisposable in addition to IFoo to the RealProxy base constructor call.
In essence, how do I implement this method to dynamically add IDisposable to IFoo to be proxied.
private static Type CombineType(Type type1, Type type2)
{
    // How to implement this method, Reflection.Emit????
    throw new NotImplementedException();
}