@@ -26,12 +26,12 @@ public class App : IDisposable
26
26
private readonly VBE _vbe ;
27
27
private readonly IMessageBox _messageBox ;
28
28
private readonly IRubberduckParser _parser ;
29
- private readonly AutoSave . AutoSave _autoSave ;
30
- private readonly IGeneralConfigService _configService ;
31
- private readonly IAppMenu _appMenus ;
32
- private readonly RubberduckCommandBar _stateBar ;
29
+ private AutoSave . AutoSave _autoSave ;
30
+ private IGeneralConfigService _configService ;
31
+ private IAppMenu _appMenus ;
32
+ private RubberduckCommandBar _stateBar ;
33
33
private readonly IIndenter _indenter ;
34
- private readonly IRubberduckHooks _hooks ;
34
+ private IRubberduckHooks _hooks ;
35
35
36
36
private readonly Logger _logger ;
37
37
@@ -387,19 +387,56 @@ private void LoadConfig()
387
387
}
388
388
}
389
389
390
+ private bool _dispose = true ;
390
391
public void Dispose ( )
391
392
{
392
- _hooks . MessageReceived -= _hooks_MessageReceived ;
393
- _configService . SettingsChanged -= _configService_SettingsChanged ;
394
- _configService . LanguageChanged -= ConfigServiceLanguageChanged ;
395
- _parser . State . StateChanged -= Parser_StateChanged ;
396
- _parser . State . StatusMessageUpdate -= State_StatusMessageUpdate ;
397
- _stateBar . Refresh -= _stateBar_Refresh ;
398
-
399
- _sink . ProjectAdded -= sink_ProjectAdded ;
400
- _sink . ProjectRemoved -= sink_ProjectRemoved ;
401
- _sink . ProjectActivated -= sink_ProjectActivated ;
402
- _sink . ProjectRenamed -= sink_ProjectRenamed ;
393
+ Dispose ( _dispose ) ;
394
+ _dispose = false ;
395
+ }
396
+
397
+ protected virtual void Dispose ( bool disposing )
398
+ {
399
+ if ( ! disposing )
400
+ {
401
+ return ;
402
+ }
403
+
404
+ if ( _hooks != null )
405
+ {
406
+ _hooks . MessageReceived -= _hooks_MessageReceived ;
407
+ _hooks . Dispose ( ) ;
408
+ _hooks = null ;
409
+ }
410
+
411
+ if ( _configService != null )
412
+ {
413
+ _configService . SettingsChanged -= _configService_SettingsChanged ;
414
+ _configService . LanguageChanged -= ConfigServiceLanguageChanged ;
415
+ _configService = null ;
416
+ }
417
+
418
+ if ( _parser != null && _parser . State != null )
419
+ {
420
+ _parser . State . StateChanged -= Parser_StateChanged ;
421
+ _parser . State . StatusMessageUpdate -= State_StatusMessageUpdate ;
422
+ // I won't set this to null because other components may try to release things
423
+ }
424
+
425
+ if ( _stateBar != null )
426
+ {
427
+ _stateBar . Refresh -= _stateBar_Refresh ;
428
+ _stateBar . Dispose ( ) ;
429
+ _stateBar = null ;
430
+ }
431
+
432
+ if ( _sink != null )
433
+ {
434
+ _sink . ProjectAdded -= sink_ProjectAdded ;
435
+ _sink . ProjectRemoved -= sink_ProjectRemoved ;
436
+ _sink . ProjectActivated -= sink_ProjectActivated ;
437
+ _sink . ProjectRenamed -= sink_ProjectRenamed ;
438
+ _sink = null ;
439
+ }
403
440
404
441
foreach ( var item in _componentsEventsSinks )
405
442
{
@@ -411,7 +448,11 @@ public void Dispose()
411
448
item . Value . ComponentSelected -= sink_ComponentSelected ;
412
449
}
413
450
414
- _autoSave . Dispose ( ) ;
451
+ if ( _autoSave != null )
452
+ {
453
+ _autoSave . Dispose ( ) ;
454
+ _autoSave = null ;
455
+ }
415
456
416
457
_projectsEventsConnectionPoint . Unadvise ( _projectsEventsCookie ) ;
417
458
foreach ( var item in _componentsEventsConnectionPoints )
@@ -422,9 +463,6 @@ public void Dispose()
422
463
{
423
464
item . Value . Item1 . Unadvise ( item . Value . Item2 ) ;
424
465
}
425
- _hooks . Dispose ( ) ;
426
-
427
- _stateBar . Dispose ( ) ;
428
466
}
429
467
}
430
468
}
0 commit comments