public void Dispose()
        {
            if (_isDisposed)
            {
                return;
            }

            foreach (var item in _moduleStates)
            {
                item.Value.Dispose();
            }

            CoClasses?.Clear();
            RemoveEventHandlers();
            VBEEvents.Terminate();

            _moduleStates.Clear();

            // no lock because nobody should try to update anything here
            _projectRepository.Dispose();

            _isDisposed = true;
        }