L'utilisation d'une DLL compilée à partir de code C dans le code C# peut être simple en utilisant P/Invoke. Cependant, des défis surviennent lorsque la DLL définit des fonctions au sein des classes, en particulier lorsque ces fonctions accèdent à des variables membres privées non statiques. Dans de tels cas, la création d'une instance de la classe est nécessaire, ce qui constitue un obstacle important.
Pour surmonter cet obstacle, il est essentiel de comprendre que l'accès direct à C les classes à partir du code C# ne sont pas réalisables. Au lieu de cela, une approche indirecte utilisant P/Invoke est requise. L'approche consiste à associer des fonctions non membres à chaque fonction membre de la classe C, les fonctions non membres invoquant les fonctions membres correspondantes.
Par exemple, considérons une classe C Foo avec une fonction membre Bar. Les fonctions non membres associées peuvent être définies comme suit :
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; }
Ces fonctions non membres peuvent ensuite être importées dans le code C# à l'aide de P/Invoke :
[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 implique la gestion d'une variable IntPtr délicate, la création d'une classe wrapper C# autour de celle-ci le pointeur peut grandement améliorer la convivialité.
Bien qu'il ne soit pas possible d'utiliser directement les classes C dans le code C#, l'approche indirecte P/Invoke permet d'accéder à leurs fonctionnalités. Même si le code C n'est pas sous votre contrôle, la création d'une DLL wrapper peut fournir l'abstraction nécessaire pour une intégration transparente avec le 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!