2010-04-08 1 views
2

J'expose certains types de données ISO C++ à .Net (mono sur Linux pour être précis). Par souci de brièveté, je me référerai à C# dans ma question, bien que ma question concerne toutes les langues .Net (avec C# et VB.Net étant mes langues cibles). Jusqu'ici, j'ai travaillé sur la façon d'exposer les types de données ISO C++ en classe C# pour une utilisation en mono - grâce à certains des gars intelligents ici sur SO.Enregistrement d'une fonction déléguée avec un rappel ISO C++ (sur mono)

Le seul problème à ce jour est de savoir comment gérer les rappels C++. Dans les langages .Net (C# et Vb.Net), je crois que les «délégués» sont l'équivalent du rappel. Pour l'instant, quelqu'un peut recommander un moyen d'enregistrer les fonctions déléguées C# avec mon code ISO C++. Le code ISO C++ est une bibliothèque de notification, et je veux pouvoir "pousser" les notifications vers le framework mono (c'est-à-dire les délégués C# dans ce cas). Mon hypothèse sous-jacente est que le mécanisme/les étapes pour implémenter ceci serait le même pour les langages .Net - je vais juste devoir coder les délégués dans la langue .Net choisie - est-ce que cette supposition est correcte?

Dernier point mais non le moindre, est la question du fil saftey. Le code ISO C++ sous-jacent que j'expose à .Net (mono pour être plus spécifique), est à la fois re-ntrant et thread safe - dois-je faire quelque chose d'extra pour appeler le délégué .Net de mon code ISO C++?

Répondre

1

Assurez-vous simplement que le pointeur de fonction que vous définissez et utilisez en C++ possède une liaison C. Vous pouvez ensuite exporter une fonction C qui prend le pointeur de fonction en tant qu'argument et vous l'appelez P/avec le délégué comme argument de C#. A partir du côté C++, vous appelez simplement le pointeur de fonction normalement.

Notez que vous devrez conserver l'objet délégué actif tant que le rappel C peut être appelé, en enregistrant probablement le délégué dans une variable statique ou similaire, si le rappel C doit être stocké pour être exécuté à une valeur de plus tard que l'enregistrement. Pour le reste, vous ne pouvez pas appeler en toute sécurité du code managé à partir de gestionnaires de signaux: à part cela, tant que votre code managé est réentrant et thread sécurisé, il en sera de même de la combinaison delgate/callback.

+0

@lupus: merci pour votre réponse (son moi - l'OP). Malheureusement, je semble avoir perdu mes informations de connexion basées sur la session, donc je ne peux pas marquer cette réponse comme acceptée - même si c'est utile. – skyeagle

+0

@lupus: pourriez-vous me diriger vers une documentation qui fournit un exemple de cela? – skyeagle

+1

J'ai deux liens qui ensemble, vous devriez être en mesure de comprendre cela, je pense. La première est de MSDN, et donne juste un aperçu de l'utilisation des délégués pour les rappels: . Ce second est un exemple utilisant GCC/Mono: . – supercheetah