| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  09-12-2008, 13:12 | #1 | 
| Junior Member Iscritto dal: Sep 2008 
					Messaggi: 28
				 | 
				
				[C#] P/invoke di callback methods
			 
		C
 Codice: typedef void (*mia_uno)(int a);
extern "C" __declspec(dllexport) void create(classe1 a1, mia_uno b2)
{
   // fa quel che deve fare	
}C# Codice: delegate void mia_uno(int a);
[DllImport("test.dll")]
internal static extern void create(IntPtr a1, mia_uno b2 );
IntPtr ptr; // viene inizializzato altrove
private void testing()
{
      mia_uno delMia = new miaDel(funccall);
       create(ptr, delMia);
}
private void funcall(int i)
{
    Console.WriteLine("ciao" + i.toString());
}Ho sbagliato qualcosa? Tutto questo genera "Eccezione win32 non gestita".   In msdn ho trovato che l'istanza del delegate deve coprire il tempo di vita del codice unmanaged. Potrebbe essere questo il problema? Come si fa a fare ciò? Ultima modifica di DuHarTapt : 09-12-2008 alle 15:39. | 
|   |   | 
|  09-12-2008, 13:55 | #2 | 
| Senior Member Iscritto dal: May 2004 Città: Londra (Torino) 
					Messaggi: 3692
				 | 
		Prova a lasciar fare il lavoro al Maresciallo. Ovvero non passare un IntPtr ad una zona unmanaged, costruisci la versione di "classe1" anche in C#, sempre se puoi (meglio struttura che classe anche qui se puoi), creane l'istanza, popola e passala alla create. Il Maresciallo della Interop dovrebbe occuparsi della copia (per quello dico piu' sicura la struttura che non la classe per riferimento) Prova anche a racchiudere la chiamata di testing in un try-catch e leggere l'eventuale innerException sperando di trovar qualcosa di piu' di una generica "Eccezione non gestita" 
				__________________ Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. | 
|   |   | 
|  09-12-2008, 14:34 | #3 | |
| Junior Member Iscritto dal: Sep 2008 
					Messaggi: 28
				 | Codice: main()
{
  try
  {
    testing();
  }
  catch(Exception e){ Console.Write(e.toString();}
  Console.Read();
}Se tolgo Console.Read() viene generata dopo l'ultima parentesi }  Quote: 
 Il problema è il passaggio delle funzioni di callback, che vengono richiamate più volte. Se passo "null" funziona tutto, quindi penso il problema sia quello.   | |
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 14:55.









 
		 
		 
		 
		






 
  
 



 
                        
                        










