L'appel de fonctions à partir d'une bibliothèque partagée (DLL) C en code C# est souvent nécessaire à des fins d'interopérabilité. Cependant, lorsque les fonctions C appartiennent à une classe qui utilise des variables membres privées, la création directe d'une instance de cette classe dans le code C# devient impossible.
Solution de contournement utilisant un P/Invoke indirect
La solution réside dans une approche indirecte P/Invoke. Cela implique de créer des fonctions non membres en dehors de la classe C qui appellent les fonctions membres de la classe.
Créer des fonctions non membres
Pour chaque fonction membre de la classe C, créez une fonction "C" externe qui appelle la fonction membre. Cela vous permet d'accéder indirectement aux variables membres privées.
Créer une classe Wrapper en C#
Une fois ces fonctions non membres définies dans la DLL C, vous pouvez créez une classe wrapper en C# pour interagir avec eux. Cette classe wrapper gérera le IntPtr gênant transmis entre les deux plates-formes et fournira une interface plus utilisable.
P/Invoquer les fonctions de la classe Wrapper
Au sein de la classe wrapper C# , vous pouvez P/Invoquer les fonctions non membres créées dans la DLL C. Ces fonctions appelleront à leur tour les fonctions membres appropriées, vous donnant accès aux fonctionnalités de la classe C.
Limitations et recommandations
L'inconvénient de cette approche est la nécessité de gérer IntPtr, ce qui peut être fastidieux. Pour améliorer la convivialité, envisagez de créer une interface C# qui reflète les fonctionnalités de la classe C. Implémentez l'interface C# dans une classe wrapper qui délègue les appels de fonction aux fonctions P/Invoke. Cette approche élimine le besoin de gérer manuellement IntPtr et fournit un modèle de programmation plus propre.
Option alternative
Si vous n'avez pas accès au code C d'origine, vous pouvez créer une nouvelle DLL qui enveloppe la DLL d'origine et fournit une couche P/Invoke. Cela vous permet d'accéder indirectement à la classe C sans modifier l'implémentation de la DLL d'origine.
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!