2009-02-08 4 views
0

Je dois créer un framework SOA gui, et je voudrais détecter automatiquement les services et les dépendances de service des modules clients. J'ai un code tel que cela jusqu'à présent, qui fonctionne à l'aide des attributs, placés sur des modules de classe:Comment puis-je analyser le code MSIL pour trouver certains appels de fonction

[ServiceProvider(typeof(DemoService3))] 
[ServiceConsumer(typeof(DemoService1))] 

Je me demande comment je peux scanner pour ces automagiquement, afin que les gens ne seraient pas oublier d'ajouter le marqueur et potentiellement obtenir des références nulles à l'exécution. Dans les services de code sont enregistrés et récupérés via les commandes suivantes:

Services.RegisterService(new DemoService1()); 
Services.FetchService<DemoService3>(); 

Je veux trouver ces appels, ainsi que les types sont passés dans (les deux prennent un type param, implicite pour le premier) ... le reste du code pour faire mes dépendances et la construction est déjà fait :)

Répondre

4

Vous aurez besoin d'analyser l'IL au niveau CLR, pas le niveau C# pour comprendre cela.

Vous devriez être en mesure de tirer parti de Mono Cecil pour le retirer.

2

Vous pouvez utiliser la réflexion Mono.Cécil ou .NET pour y parvenir.

Mono.Cecil est recommandé en raison de ses meilleures performances et de sa flexibilité. Voici quelques exemples (Cecil + extensions simples sur le dessus) qui pourrait vous aider à démarrer:

2

Si vous ne parvenez pas à utiliser Mono.Cecil pour une raison quelconque, vous pourriez envisager d'analyser l'IL à la main: vous auriez juste besoin de trouver call et callvirt instructions, en faisant peut-être assez d'analyse statique pour comprendre le type retourné par new DemoService1().

typeof(YourClass).GetMethod("YourMethod").GetMethodBody().GetILAsByteArray() est votre ami.

Questions connexes