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

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)
le but étant de passer la fonction de gestion "log" en tant que parametre.

pour le moment j'utilise une fonction globale, exterieure a une classe, qui est :

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();
}
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
   solver_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 :

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();
      }
}
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
   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 ?