Problème :
Utilisation de P/Invoke pour accéder aux fonctions dans un C La DLL avec des variables membres et des méthodes non statiques nécessite la création d'instances de la classe de définition. Comment accéder à cette classe ?
Réponse :
L'utilisation directe d'une classe C en C# n'est pas possible. Suivez plutôt ces étapes :
Exemple :
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; }
Dans C# :
[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);
Classe Wrapper :
Pour simplifier l'utilisation, enveloppez le pointeur IntPtr dans une classe wrapper C# :
public class FooWrapper { private IntPtr _foo; public FooWrapper() { _foo = Foo_Create(); } public int Bar() { return Foo_Bar(_foo); } public void Dispose() { Foo_Delete(_foo); } }
Approche alternative :
Si vous ne parvenez pas à modifier la DLL d'origine, créez un DLL intermédiaire qui encapsule la DLL d'origine et expose la classe encapsulée en 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!