Bonjour a tous, j'ai un petit pb de passage du monde non manage dans le monde manage..
je possede une dll ecrite en je ne sais quoi (C++ je pense) dont une des methode est
le but étant de passer la fonction de gestion "log" en tant que parametre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef void(* cm2::fem::solver_static_Newton::operating_mode_type::display_handler_type)(unsigned level, const char *msg)
pour le moment j'utilise une fonction globale, exterieure a une classe, qui est :
et elle est passee en pointeur dans la classe de la dll par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /** \fn logfile_handler() \brief utilise en tant que Handler pour les solveurs */ static void logfile_handler(unsigned level, const char* msg) { StreamWriter ^stream = File::AppendText("LOG.txt"); if (level < 10) { String ^message = gcnew String(msg); stream->WriteLine(message); } stream->Close(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4solver_static_Newton::operating_mode_type solver_operatingmode; // initialise le mode operatoire du solveur solver_operatingmode.display_hdl = &logfile_handler;
Or, je voudrai utiliser des evenements .NET et de ce fait utiliser une
methode interne a une classe managee.
j'ai un peu regarde les fonctions de mashalisations et de delegate.
j'ai une classe managee :
et la j'utilise la fonction de marshalisation pour passer du monde manage au non manage par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 public ref class gsd_fea { constructeurs destructeur methodes etc... // je cree un delegate et une fonction qui me permettrait de gérer // le handler du solveur : public: delegate void gsdfea_delegate_logfile_handler(unsigned level, const char* msg); void gsdfea_logfile_handler(unsigned level, const char* msg) { StreamWriter ^stream = File::AppendText("LOGDELEGATE.TXT"); if (level < 10) { String ^message = gcnew String(msg); stream->WriteLine(message); } } stream->Close(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 solver_static_Newton::operating_mode_type solver_operatingmode; // initialise le mode operatoire du solveur gsd_fea::gsdfea_delegate_logfile_handler ^logtodo = gcnew gsd_fea::gsdfea_delegate_logfile_handler(this,&gsd_fea::gsdfea_logfile_handler); solver_operatingmode.display_hdl = (cm2::fem::solver_static_Newton::operating_mode_type::display_handler_type) Marshal::GetFunctionPointerForDelegate(logtodo).ToPointer();
Le code compile sans warnings mais plante a l'execution comme si il n'arrivait pas a passer de messages ou d'arguments.
Existe t'il une autre voie pour faire cela ?
Partager