Accès aux classes C dans le code C# via une DLL
Lors de l'interface avec une DLL C à partir du code C#, des limitations surviennent lors de la tentative d'accès direct aux classes défini dans la DLL. Malgré la capacité de P/Invoke à exposer des fonctions, les fonctions au sein des classes s'appuient sur des variables membres non statiques, nécessitant la création d'instances.
P/Invoke et accès indirect
Bien que direct l'accès à la classe n'est pas réalisable, P/Invoke peut être utilisé indirectement pour accéder aux membres de la classe. L'approche consiste à créer des fonctions non membres qui appellent les fonctions membres de la classe.
Exemple de code
Considérez le code C suivant :
class Foo { public: int Bar(); }; extern "C" Foo* Foo_Create() { return new Foo(); } extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); } extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }
Ici, le code C expose la classe Foo via des fonctions non membres.
C# Interfaçage
En C#, P/Invoke peut accéder à ces fonctions :
[DllImport("Foo.dll")] public static extern IntPtr Foo_Create(); [DllImport("Foo.dll")] public static extern int Foo_Bar(IntPtr value); [DllImport("Foo.dll")] public static extern void Foo_Delete(IntPtr value);
Le code C# doit désormais gérer les valeurs IntPtr, qui peuvent être encapsulées dans une classe wrapper pour plus de commodité.
Approche alternative
Si la propriété directe du code C n'est pas possible, une DLL distincte peut être créée pour envelopper la DLL d'origine et fournir une couche P/Invoke, simplifiant ainsi l'interaction du code C# avec la classe C.
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!