2010-06-29 38 views
4

Supposons que j'ai les classes .NET suivantes:Puis-je rediriger les appels de méthode .NET vers une nouvelle méthode lors de l'exécution?

public class C 
{ 
    public void M() 
    { 
     .... 
    } 
} 

et

public class D 
{ 
    public void N() 
    { 
     .... 
    } 
} 

Ces 2 classes se trouvent dans différents espaces de noms, dans les différentes assemblées. Y at-il un moyen de provoquer tous les appels à C.M() pour «rediriger» automatiquement à D.N()? Donc, la méthode d'appel appelle son C.M, mais en réalité, D.N est ce qui est appelé, avec tous les paramètres que C.M aurait pris. Ce n'est pas grave si cela se produit pour toutes les instanciations de la classe, ou juste pour un objet spécifique.

MS Research a le Detours Library qui peut faire quelque chose de très similaire pour les exportations normales de DLL Win32. Je suis à la recherche d'un moyen de le faire avec une méthode .NET.

Répondre

1

Essayez Dependency Injection?

Modifier C:

public class C 
{ 
    public void M() 
    { 
     if (Override != null) { Override.N(); } 
     else { 
      .... 
     } 
    } 

    public D Override 
} 

Si vous avez besoin d'une plus grande flexibilité, Extract Interface de la classe D.

3

Il existe principalement deux approches possibles - mandatement les objets ou les appels d'accrochage.

La transmission par proxy peut être effectuée à l'aide de Castle Dynamic Proxy ou de toute structure de proxy dynamique similaire. Accrocher les appels peut se faire soit avec la programmation orientée aspect avec quelque chose comme PostSharp ou même par la magie noire comme fait par Isolator (il est conçu pour les tests unitaires, mais il peut probablement être (ab) utilisé comme toutes les autres technologies)

5

Microsoft a créé un équivalent géré à Detours appelé Moles. La seule chose dont je ne suis pas sûr, c'est la licence; il est destiné à être testé (dans le cadre de Pex).

L'injection de dépendance nécessite la modification de la source; PostSharp nécessite de modifier le binaire; mais Moles peut être fait dynamiquement à l'exécution.

+0

Moles semble prometteur. Un test rapide devrait déterminer si c'est techniquement approprié pour cet usage ou non. Si oui, je vais accepter cela. –

+0

Moles est librement disponible pour une utilisation commerciale par les licenciés MSDN - hourra! – code4life