Salut, j’ai besoin de votre aide pour un peu de programmation en C#, pour quelquechose que j’avais déjà bien du mal à faire en C
Je voudrais réaliser, dans une API, une fonction de type “register_callback_for_x” pour une boucle. Donc un truc qui en C se serait écrit
int register_callback_for_x(int()the_callback(void)) … et encore j’suis pas sur de la déclaration (j’me rappelle plus où on fout le pointeur et les parenthèses ).
Tout ca me pose 3 problèmes :
- comment fait-on un pointeur de fonction ?
- le void* ca existe en C# ? sinon comment je fais (ca doit surement être prévu) ?
- j’suis en train de pondre une API en C#, mais les fonctions seront certainement utilisées par du C++; comment devrais-je déclarer tout cela dans le .h/.hpp ? Y’a de quoi générer tout cela dans VisualStudio.Net ?
[quote] - comment fait-on un pointeur de fonction ?
- le void* ca existe en C# ? sinon comment je fais (ca doit surement être prévu) ?[/quote]Pointeur de fonction ? Va voir du coté des delegates dans la doc.
Delegate = Pointeur de fonction typé (oui, glop, je sais, c’est pas tout a fait ca, mais je simplifie).
Sinon, t’es dans un language objet, alors le void*, tu oublies, d’une part pasque pointeur, a pas bo, et d’autre part, pasque tout type dérive d’object donc :
// tu crées une delegate :
int delegate MyCallBackDelegateQuiRenvoieDuInt (object o);
// Ta fonction qui demande un callback :
void FonctionQuiPrendsUnCallback(MyCallBackDelegateQuiRenvoieDuInt callback){
// Truc
// Appel du callback
int res = callback(objectenparametre);
// Chose
}
// Et pour l’appel de la fonction
void FonctionQuiAppelleLaFonctionQuiPrendsUnCallback(){
MyCallBackDelegateQuiRenvoieDuInt callback;
callback = new MyCallBackDelegateQuiRenvoieDuInt (FonctionQuiRespecteLePrototype);
FonctionQuiPrendsUnCallback(callback);
}
En gros, c’est ca. Mais vois quand même la doc, t’as tout pleins d’exemples dedans.
Merci Tzim, ca me semble etre parfaitement ca. Par contre cette autre question risque de me poser un gros problème ?
Peut-on utiliser une DLL faite C# comme n’importe quelle autre DLL,dans d’autres programmes en C/C++ notamment ? comment je l’integre à mes programmes en C/C++ (comment générer le .h, le .lib, etc.)
J’ai cru lire, ici ou là, que cela n’était pas possible (à moins de grosses bidouilles n’importe comment, ce qui est assez inenvisageable, puisque je ne sais pas QUI va utiliser mes DLL, ni le reste de leur programme, etc, etc.)
ou tu fais du managed C++ et t’as rien a faire Mais dans ce cas la ca tourne en .Net.
ou tu exporte tes fonctions, par COM par exemple, et dans ce cas la tu passes par COM pour faire le marshalling natif/managed.
Les deux marchent tres bien, par exemple dans visual studio toute la base de l’IDE est en code natif, mais tous les designers sont en code managed et on arrete pas de faire des callback dans un sens et dans l’autre et au final ca marche tres bien et de l’exterieur on y voit que du feu. Bon c’est un peu poilu parfois hein, c’est plus de l’utilisation “avancee” que de la prog .Net de base, et faut pas avoir peur quoi, mais ca se fait tres bien.
Par contre au passage les “anonymous delegate” c’est une nouveaute de C# v2 et c’est carrement sympa Une petite recherche sur google sur le sujet vous en apprendra plus… et tout ce qu’on peut faire de malin avec. Bon, la aussi c’est pas du C# niveau de base, mais ca le fait carrement. Ce message a été édité par GloP le 18/04/2004
merci ô dieu GLoP de m’avoir éclairé la voie.
Cependant, vu que je cherche à faire un truc le plus propre possible, me voilà prit entre 2 choix :
Faire du C# (top cool simple classe que j’aime), mais faire une grosse carcasse COM autour (beurk)
Faire du C++ (moins cool, moins classe, mais pas compliqué quand même)
Malheureusement, le C++ va l’emporter (adieu, veaux vaches cochons… pourquoi je dis ca moi ?)
C++, me revoilà ! (oui, ca fait longtemps que j’ai pas programmé, mais je suis mo-ti-véééé… s’t’aprem, hop, du maiden dans les zoreiles et ca va pisser du code ! MOUAHAHA)
PS : L’homme qui a écrit ces lignes vient, en direct, de peter une durite, merci de l’excuser