Est-il possible d'insérer du code IL dans la méthode C#?Comment insérer le code CIL dans C#
Répondre
Si inline IL (dans le même esprit d'assemblage en ligne pris en charge par les compilateurs C et C++) est ce que vous cherchez, cela peut être réalisé en utilisant la compilation de post-compilation aller-retour.
Mike Stall a écrit une fois a tool for that, pour autant que je sais qu'il est assez mûr:
Autre que cela, vous pouvez utiliser F # qui soutient Inline IL.
L'outil dont vous avez besoin s'appelle Cecil et fait partie du projet Mono.
Vous pouvez obtenir plus d'informations à ce sujet ici: http://www.mono-project.com/Cecil
Tiré du site ci-dessus:
Cecil est une bibliothèque écrite par Jb Evain (http://evain.net/blog/) pour générer et inspecter des programmes et des bibliothèques dans la Format ECMA CIL. Il a un support complet pour les génériques, et supporte un certain format de symbole de débogage. En anglais simple, avec Cecil, vous pouvez charger des assemblages gérés existants, parcourir tous les types contenus, les modifier à la volée et sauvegarder sur le disque l'assemblage modifié.
DynamicMethod est la manière légère d'accomplir ceci à l'exécution.
Le compilateur Microsoft C# ne prend pas en charge l'injection de IL au moment de la compilation, mais un outil de tissage de code peut le faire en tant qu'étape post-compilation.
Je viens juste de posted a utility qui permet de remplacer automatiquement des corps de fonctions C# entiers par IL en ligne, en utilisant un attribut personnalisé. Comme les utilitaires similaires, cela fonctionne via l'aller-retour ILDASM/ILASM qui peut être configuré comme une étape de post-construction. L'outil ajuste également la PDB afin de préserver les points d'arrêt à un seul pas et de définir des instructions IL individuelles dans le débogueur. Il est différent de quelques-uns des autres inliners de IL aller-retour en ce qu'elle (seulement) substituts pour les organismes de fonction entière, comme celle-ci:
class MyClass
{
[ILFunc(@"
.locals init ([0] int32 i_arg)
ldc.i4.3
ret
")]
int MyFunc(int i_arg)
{
return 3;
}
};
Pour des méthodes très critiques de performance, j'essayé d'utiliser DynamicMethod
pour améliorer compiler- généré IL, mais a constaté que l'avantage est perdu en raison de l'en-tête d'appel délégué. Inline IL donne le bénéfice de l'IL ajustée manuellement sans ce hit, en supposant qu'il n'y ait pas de personnalisations d'exécution dont vous auriez vraiment besoin pour DynamicMethod
.
Le code source complet est situé à http://www.glennslayden.com/code/c-sharp/inline-il
n'a pas trouvé d'attribut ILFunc dans votre lib. – Denis
@Denis Je ne pense pas que je fournissais une lib. C'est le code source, et il y a deux fichiers sur la page Web. Le second (défiler au-delà du texte supplémentaire) contient la définition de ILFunc 'Attribute' lui-même. –
Sérieusement génial! Merci! – Thought