Рассмотрим следующий фрагмент кода:
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? Как это выполняется?
Спасибо за продвижение.