3 votes

Exportez la fonction avec des paramètres clr depuis le dll ?

J'ai un dll géré en c++, et j'ai besoin d'appeler une fonction qui renvoie un type géré.

Pour les dllexports sans types gérés, c'est facile, il suffit de définir ma fonction c(++) statique dans un en-tête comme ceci :

extern "C" 
{
  __declspec(dllexport)  int  __cdecl  InitSystem();
}

Mais maintenant la fonction c(++) statique doit renvoyer un type géré, et là j'ai un problème. Si j'essaie (par exemple) :

extern "C" 
{
  __declspec(dllexport)  System::Collections::Generic::List^  __cdecl  InitSystem();
}

Je reçois une erreur du compilateur (La définition de la fonction nécessite une signature __clrcall).

Étant donné que le DLL n'est pas une assembly (je crois), je suis un peu perdu sur la manière d'exporter un appel de fonction simple en utilisant des paramètres .net/clr. Cela doit probablement être simple et je regarde juste dans la mauvaise direction ?

2voto

Hans Passant Points 475940

Il doit s'agir d'un assembly, il n'y a pas d'autre moyen de construire du code avec un type géré de cette manière. Mélanger du code géré et du code natif dans un même assembly est acceptable. Ce qui résout automatiquement le problème, la fonction sera disponible dans les métadonnées, pas besoin de l'exporter. Vous devez supprimer toute la décoration, elle ne peut pas être appliquée à une méthode gérée. Et elle devrait être dans une classe ref pour permettre à d'autres langages gérés de l'utiliser.

public ref class Mumble {
public:
    static System::Collections::Generic::List^  InitSystem();
};

Un programme C# peut maintenant utiliser var lst = Mumble.InitSystem(). Il est recommandé d'utiliser un espace de noms.

Attention à /clr d'ailleurs, il convertira facilement du code natif en IL sans se plaindre. Soit vous désactivez /clr sur un fichier source de code, soit vous utilisez #pragma managed.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X