L'intégration transparente des types COM en C# suscite la curiosité des développeurs. Cet article approfondit le mécanisme du compilateur pour détecter les types COM et illustre comment il peut réaliser des opérations apparemment anormales.
Un aspect déroutant de la gestion des types COM est la manière dont les interfaces telles que Application sont construites en C#. Le compilateur C# semble autoriser l'appel de constructeurs sur les interfaces, comportement généralement interdit dans d'autres langages. Cette illusion est obtenue en appelant implicitement Type.GetTypeFromCLSID() pour récupérer la classe COM correcte, puis en appelant Activator.CreateInstance pour créer une instance de cette classe.
De plus, C# 4 a introduit une fonctionnalité qui permet aux développeurs de fournir des paramètres non-référence pour les paramètres de référence. Le compilateur crée automatiquement une variable locale à transmettre par référence, supprimant ainsi la valeur d'origine. Le code suivant illustre ce comportement :
<code class="language-c#">app.ActiveDocument.SaveAs(FileName: "test.doc");</code>
Le paramètre FileName est techniquement un paramètre de référence, mais le code transmet une valeur constante. Le compilateur gère cette différence de manière transparente.
Essayer d'imiter le premier scénario (instancier directement l'interface) s'est avéré un échec. Cependant, le deuxième scénario peut être reproduit en utilisant les modificateurs ref et in, comme suit :
<code class="language-c#">Dummy dummy = null; dummy.Foo(in 10);</code>
Contrairement à la nouvelle construction Dummy() attendue, ce code utilise le modificateur in pour transmettre la variable par référence sans changer sa valeur.
La clé pour que le compilateur soit capable de reconnaître les types COM est l'attribut CoClass. En annotant une interface avec [CoClass(typeof(Test))], le compilateur peut déduire l'existence de la classe d'implémentation sous-jacente et générer le code nécessaire pour l'instancier.
Cette découverte ouvre de nouvelles possibilités d’interaction avec les types COM en C#, améliorant ainsi les capacités d’interopérabilité du langage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!