web-dev-qa-db-fra.com

Encapsuleur C ++ / CLI pour C ++ natif à utiliser comme référence en C #

Le titre explique. J'ai des DLL C++ natives pour lesquelles j'écris des wrappers C++/CLI, qui seront à leur tour importés en C # comme référence.

Le problème est qu'en C #, je ne vois pas les classes que j'ai dans le wrapper (importées de DLL).

Quels mots clés dois-je utiliser et COMMENT re-déclarer mes objets C++ natifs pour qu'ils deviennent visibles en C #?

30
Haix64

Ok, tutoriel. Vous avez une classe C++ NativeClass que vous souhaitez exposer à C #.

class NativeClass { 
public:
    void Method();
};

1) Créez un projet C++/CLI. Lien vers votre bibliothèque et vos en-têtes C++.

2) Créez une classe wrapper qui expose les méthodes que vous souhaitez. Exemple:

#include "NativeClass.h"

public ref class NativeClassWrapper {
    NativeClass* m_nativeClass;

public:
    NativeClassWrapper() { m_nativeClass = new NativeClass(); }
    ~NativeClassWrapper() { this->!NativeClassWrapper(); }
    !NativeClassWrapper() { delete m_nativeClass; }
    void Method() {
        m_nativeClass->Method();
    }
};

3) Ajoutez une référence à votre projet C++/CLI dans votre projet C #.

4) Utilisez le type wrapper dans une instruction using :

using (var nativeObject = new NativeClassWrapper()) {
    nativeObject.Method();
}

L'instruction using garantit que Dispose () est appelé, ce qui exécute immédiatement le destructeur et détruit l'objet natif. Sinon, vous aurez des fuites de mémoire et mourrez probablement horriblement (pas vous, le programme). Remarque: La méthode Dispose () est créée par magie pour vous .

66
Asik