2010-07-14 7 views
1

envisager de suivre morceau de code:Comment .NET remplace la méthode non virtuelle dans .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; 
     } 
    } 
} 

Méthode A :: currentDomain est non virtuelle, la classe A est scellé. Mais CLR intercepte l'appel de méthode et le redirige vers une autre instance. Comment c'est possible? Est-ce une sorte de magie vaudou? Est-ce que CLR fait une exception dans la méthode appelant un objet hérité de la classe MarshalByRefObject? Comment est-il effectué?

Merci d'avance.

Répondre

1

Le compilateur JIT est parfaitement conscient qu'il génère du code pour un proxy. Vous pouvez avoir un look-voir avec le code source SSCLI20, clr \ src \ vm \ jithelpers.cpp, rechercher "proxy".