请考虑以下代码:
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类继承的对象的方法中是否有异常?它是如何表现的?
谢谢你提前。
答案 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”。