Comment fonctionne extern en C #?

Chaque fois que je regarde assez profondément dans le réflecteur, je rencontre des méthodes extern sans aucune source. J’ai lu la documentation msdn à http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx . Ce que j’ai compris de cet article, c’est que les méthodes avec le modificateur extern doivent être injectées. J’ai interprété cela comme signifiant que cela fonctionne comme un motif d’usine abstrait. J’ai également remarqué que je n’avais jamais vu de méthode externe non statique. La déclaration statique est-elle une exigence (je pourrais voir comment cela aurait du sens)? Je suis encore en train de deviner ici et je ne sais pas comment cela fonctionne réellement. Il me semble que le compilateur doit reconnaître certains atsortingbuts qui limitent le traitement, mais je ne sais pas quels sont les atsortingbuts autres que ceux que j’ai rencontrés comme MethodImplAtsortingbute et DllImportAtsortingbute de l’exemple MSDN. Comment quelqu’un extern t-il l’atsortingbut extern ? Il a déclaré que dans de nombreux cas, cela peut améliorer les performances. En outre, comment pourrais-je aller sur la source des méthodes Object.InternalGetEquals() comme Object.InternalGetEquals() ?

Envisagez de lire la section 10.6.7 de la spécification C #, qui répond à plusieurs de vos questions. J’en reproduis une partie ici pour votre commodité:


Lorsqu’une déclaration de méthode inclut un modificateur extern, cette méthode est dite externe. Les méthodes externes sont implémentées en externe, généralement en utilisant un langage autre que C #. Une déclaration de méthode externe ne fournissant aucune implémentation réelle, le corps de méthode d’une méthode externe consiste simplement en un point-virgule. Une méthode externe peut ne pas être générique. Le modificateur extern est généralement utilisé avec un atsortingbut DllImport, ce qui permet aux méthodes externes d’être implémentées par les DLL (Dynamic Link Libraries). L’environnement d’exécution peut prendre en charge d’autres mécanismes permettant de mettre en œuvre des méthodes externes. Lorsqu’une méthode externe inclut un atsortingbut DllImport, la déclaration de méthode doit également inclure un modificateur statique.


Comment quelqu’un utilise-t-il l’atsortingbut externe?

  • Écrivez votre code dans le langage non géré de votre choix.
  • Comstackz-le dans une DLL, en exportant le point d’entrée de votre code.
  • Créez une bibliothèque d’interopérabilité qui définit la méthode en tant que méthode externe dans la DLL donnée.
  • Appelez-le depuis C #.
  • Profit!

Comment pourrais-je regarder dans la source des méthodes externes comme Object.InternalGetEquals ()?

Allez à https://github.com/dotnet/coreclr/tree/master/src/vm

Les méthodes marquées extern avec l’atsortingbut [DllImport] sont généralement des appels à des bibliothèques C. Cette fonctionnalité est utile pour appeler WinAPI ou le code hérité.

Ceci est un exemple de MSDN:

 using System; using System.Runtime.InteropServices; class MainClass { [DllImport("User32.dll")] public static extern int MessageBox(int h, ssortingng m, ssortingng c, int type); static int Main() { ssortingng mySsortingng; Console.Write("Enter your message: "); mySsortingng = Console.ReadLine(); return MessageBox(0, mySsortingng, "My Message Box", 0); } } 

Il appelle MessageBox qui est défini dans la bibliothèque Windows user32.dll . Runtime fait tout le travail lourd pour vous ici, bien que parfois vous ayez besoin de gérer manuellement la mémoire. Si vous obtenez la signature incorrecte, votre programme peut échouer lors de l’appel, vous pouvez introduire une fuite ou la méthode peut renvoyer quelque chose de complètement différent, alors faites attention! Je trouve que pinvoke.net est un excellent instrument pour corriger les signatures de différentes API.

Certaines méthodes extern .NET Framework qui n’ont pas d’atsortingbut [DllImport] mais sont décorées avec l’ [MethodImpl (MethodImplOptions.InternalCall)] sont généralement celles implémentées dans CLR lui-même, qui est également écrit en C. Certaines de ces méthodes ne peuvent tout simplement pas être implémentées en C # car elles gèrent le runtime lui-même, et certaines sont implémentées en C car leurs performances sont critiques et C plus rapide.

Voici ce que MSDN dit à leur sujet:

Spécifie un appel interne. Un appel interne est un appel à une méthode implémentée dans le Common Language Runtime lui-même.

En ce qui concerne le code d’implémentation, je doute que vous puissiez l’obtenir de Microsoft, mais il existe d’ autres implémentations intéressantes de CLR, alors assurez-vous de les vérifier.

extern est avec invocation de plate-forme (pinvoke) pour faciliter les assemblys gérés appelant dans du code non géré. Le mot clé extern informe le compilateur qu’il devra générer le code correct pour autoriser le marshaling de données correct.

Nous utilisons le modificateur “extern” dans la déclaration de méthode. Il est utilisé pour indiquer que la méthode est implémentée en externe. Une utilisation courante du modificateur “extern” est avec l’atsortingbut DllImport. Les appels de fonctions non C # sont gérés avec cet atsortingbut. Si vous utilisez le modificateur extern, vous devez inclure l’espace de noms suivant:

using System.Runtime.InteropServices;

La syntaxe est quelque chose comme:

[DllImport("User32.dll")] public static extern int MessageBox(int h, ssortingng m, ssortingng c, int type);