Accès aux classes C dans le code C# via l'intégration de DLL
Lors de l'intégration du code C# avec une DLL C préexistante, l'accès aux classes définies dans le Les DLL peuvent présenter un défi. Bien que P/Invoke vous permette d'interfacer avec les fonctions de la DLL, il ne prend naturellement pas en charge l'accès aux classes.
Pour surmonter cette limitation, vous pouvez utiliser une approche P/Invoke indirecte. Cela implique de créer des fonctions non membres pour chaque fonction membre de la classe cible qui encapsule l'appel de la fonction membre.
Par exemple, considérons une classe C Foo avec une fonction membre Bar():
class Foo { public: int Bar(); };
Pour accéder à Foo en C#, vous devez créer trois fonctions externes :
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; }
En C#, ces fonctions peuvent être P/Invoked :
[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);
Bien que cette approche donne accès à la classe C, elle introduit un IntPtr opaque que vous devez gérer. Pour créer une interface plus conviviale, vous pouvez créer une classe wrapper C# autour de ce pointeur, encapsulant les opérations nécessaires.
Même si vous n'avez pas d'accès direct au code C, vous pouvez toujours créer une classe distincte DLL qui enveloppe la DLL d'origine, fournissant une couche P/Invoke et exposant une interface plus adaptée au code 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!