j'ai u probleme avec une application qui mixe le C# le c++ cli et des des dll C++ non managées

je communique depuis les dll C++ natif vers le C# via des pointeurs sur des delege. cela fonctionne très bien en debug mais quand je suis en release j'ai des crash lors de l'appel des deleges.

En recherchant un peu le problème semble venir des l'allocation du delege et de la non fixité de l'adressage du delege lors des passes de nettoyage par le garbage collector

j'ai essaye de fixer l'allocation via le stockage d'un handle sur le delege
mais cela ne marce tj pas :

voici en extrait du code.

merci de votre aide.

Joel

C# :
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
public class Control
{
private GCHandle m_gch;
private  Control_Wrp     m_Kernel;
 
public void test()
{int a = 123;}
 
private CallBackDelegate _delegate = new CallBackDelegate(test);
 
public Control()
{
       m_gch = GCHandle.Alloc(_delegate);
  m_Su_Kernel = new CControl_CCD_Wrp(
                m_ControlCCDJob_Type,
                m_gch,true);
}
 
}
C++/CLI (dans une dll)
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
typedef void (*NativeToManaged)(); 
 
public ref class Control_Wrp
{
 public: Control_Wrp(GCHandle Gch) 
{
 m_pKernel= new CControl_Kernel();
 
CallBackDelegate^ CallBackManaged = (CallBackDelegate^)Gch.Target;
 
System::IntPtr p = System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(CallBackManaged);
			m_funcPointer = (NativeToManaged) p.ToPointer();
			m_pKernel->SetFunction(m_funcPointer);
}
private : CControl_Kernel * m_pKernel; //obj non managee
private: NativeToManaged m_funcPointer;
}

C++ Natif

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
class CControl_Kernel
{
CControl_Kernel()
{
...
}
void test()
{
m_CallBackFunction();
}
 
void SetFunction(NativeToManaged fct){m_CallBackFunction = fct;}
protected: NativeToManaged		m_CallBackFunction;
 
}

Lorsque l'on appelle test puis le code natif, la fonction test C# est déclenchée (en debug uniquement) en release j'ai un crash

une idée ?