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# :
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
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); } }
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 ?
Partager