Lets focus sul ProjectAdded
evento (anche se problema descritto è esattamente lo stesso per il resto degli eventi).
L'esempio di codice che hai mostrato tenta di registrare il gestore SolutionEvents_ProjectAdded
per l'evento ProjectAdded
. Tuttavia, l'oggetto SolutionEvents
che espone l'evento ha una durata limitata alla chiusura del suo metodo di avvolgimento (non hai mostrato la sua firma, chiamiamolo Connect
). Dopo che il flusso di controllo aveva lasciato tale ambito, oggetto locale è già stato garbage collection, per cui il suo caso non viene mai chiamato:
codice rotto:
public class Connector
{
public void Connect()
{
((Events2)dte.Events).SolutionEvents.ProjectAdded += SolutionEvents_ProjectAdded;
}
void SolutionEvents_ProjectAdded()
{
// callback is dead
}
}
Per rimediare, è necessario assegnare il SolutionEvents
oggetto di alcune variabili, la cui durata si estende su un gestore SolutionEvents_ProjectAdded
- ad es. sull'intera classe di wrapping. Nel seguente esempio, la portata si estende sopra il tipo intera (che chiameremo Connector
), e assicura che il gestore è accessibile durante la durata di questo tipo:
codice fisso:
public class Connector
{
SolutionEvents _solutionEvents;
public void Connect()
{
_solutionEvents = ((Events2)dte.Events).SolutionEvents;
_solutionEvents.ProjectAdded += SolutionEvents_ProjectAdded;
}
void SolutionEvents_ProjectAdded()
{
// callback works
}
}
Per essere più precisi, controllare questo riferimento MSDN - Scoping Variables Appropriately in Event Handlers:
un errore comune nei gestori di eventi di programmazione si connette il gestore di eventi a un oggetto che è stato dichiarato w con uno scope troppo limitato allo scopo di gestire l'evento. L'oggetto deve avere una durata che si estende non solo sulla funzione che collega il metodo callback come gestore di eventi dell'oggetto, ma anche sul metodo callback in cui l'evento viene effettivamente gestito.Altrimenti, se l'oggetto è fuori ambito e non è più definito nel metodo callback , il metodo di callback non viene chiamato e l'evento non viene gestito come .
Qual è '_hSolutionEvents' in' Initialize() '? –
Hai ragione, hai aggiornato il codice! Ho pensato un altro a '_hSolutionEvents', che è necessario per' UnadviseSolutionEvents' e aggiungo anche il nuovo codice. E 'un peccato che non ci siano molte informazioni su come creare plugin per il miglior DevTool ... – FooBarTheLittle