Détection des types COM en C#
La façon dont le compilateur C# gère les types COM est tout à fait unique. Un exemple notable est la possibilité d'instancier des interfaces, comme le montre l'exemple suivant :
<code class="language-csharp">Word.Application app = new Word.Application();</code>
Bien qu'Application soit une interface, elle peut être instanciée. Ceci est réalisé en convertissant les appels en Type.GetTypeFromCLSID() et Activator.CreateInstance.
Un autre comportement unique en C# 4 est la possibilité de transmettre des paramètres non-ref aux paramètres ref. Le compilateur ajoute automatiquement une variable locale pour transmettre les paramètres par référence sans affecter la valeur réelle.
Pour comprendre comment le compilateur effectue ces transformations, nous pouvons créer un exemple personnalisé :
<code class="language-csharp">[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")] public interface Dummy { void Foo(ref int x); } class Test { static void Main() { Dummy dummy = null; dummy.Foo(10); } }</code>
Ce code s'exécutera avec succès et montre comment transmettre le paramètre ref par valeur.
Cependant, disons que nous voulons essayer d'instancier l'interface :
<code class="language-csharp">Dummy dummy = new Dummy();</code>
Bien que ce code ne s'exécute pas correctement, il souligne la nécessité d'étudier la "magie" du compilateur. Pour réellement instancier une interface, nous pouvons utiliser l'attribut CoClass :
<code class="language-csharp">[System.Runtime.InteropServices.CoClass(typeof(Test))] public interface Dummy { }</code>
L'attribut CoClass associe une classe d'implémentation à une interface, lui permettant d'être instanciée comme un objet concret. Cette approche est généralement utilisée lorsqu'une API COM nécessite l'instanciation d'une interface.
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!