Как .NET переопределяет не виртуальный метод в .NET Remoting? - PullRequest
1 голос
/ 15 июля 2010

Рассмотрим следующий фрагмент кода:

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 ]

2 голосов
/ 15 июля 2010

По сути, это волшебство, т.е. возможность сделать это встроена в среду выполнения .NET.Хорошей новостью является то, что ваш код также может сделать это, если ему нужно: http://msdn.microsoft.com/en-us/library/system.runtime.remoting.proxies.realproxy.aspx

1 голос
/ 15 июля 2010

JIT-компилятор прекрасно понимает, что он генерирует код для прокси.Вы можете посмотреть исходный код SSCLI20, clr \ src \ vm \ jithelpers.cpp, поиск "proxy".

...