.NET如何重写.NET Remoting中的非虚方法?

时间:2010-07-14 20:02:49

标签: c# .net remoting

请考虑以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RemotingNonVirtualCall
{
    class Program
    {
        static void Main(string[] args)
        {
             var domain = AppDomain.CreateDomain("Second Domain");
            A extA = (A)domain.CreateInstanceAndUnwrap(typeof(A).Assembly.FullName, typeof(A).FullName);
            Console.WriteLine(extA.CurrentDomain());
        }
    }

    [Serializable]
    sealed class A : MarshalByRefObject
    {
        public string CurrentDomain()
        {
            return AppDomain.CurrentDomain.FriendlyName;
        }
    }
}

方法A :: CurrentDomain是非虚拟的,A类是密封的。但CLR拦截方法调用并将其重定向到另一个实例。怎么可能?这是某种伏都教魔法吗? CLR在调用从MarshalByRefObject类继承的对象的方法中是否有异常?它是如何表现的?

谢谢你提前。

2 个答案:

答案 0 :(得分:2)

它本质上是神奇的,即执行此操作的能力内置于.NET运行时。好消息是,如果需要,您的代码也可以执行此操作:http://msdn.microsoft.com/en-us/library/system.runtime.remoting.proxies.realproxy.aspx

答案 1 :(得分:1)

JIT编译器敏锐地意识到它为代理生成代码。您可以查看SSCLI20源代码clr \ src \ _vm \ jithelpers.cpp,搜索“proxy”。