Метод инициализации пакета Visual Studio не вызывается при отладке - PullRequest
9 голосов
/ 30 августа 2011

В настоящее время я разрабатываю расширение для Visual Studio 2010 с использованием MEF, и мне нужно инициализировать мое глобальное состояние. Я пытаюсь сделать это в методе Package.Initialize

[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0.0.0", IconResourceID = 400)]
[Guid("1AF4B41B-F2DF-4F49-965A-816A103ADFEF")]
public sealed class MyPackage : Package
{

    protected override void Initialize()
    {
        ContainerConfigurator.Configure();
        ContainerConfigurator.IsInitialized = true;
        base.Initialize();
    }
}

Также у меня есть поставщик классификатора MEF, который использует это состояние

[Export(typeof(IClassifierProvider))]
[Name("This is my provider")]
[ContentType("DebugOutput")]
[ContentType("Output")]
public class MyClassifierProvider : IClassifierProvider
{
    [Import]
    private IClassificationTypeRegistryService _classificationRegistry = null; // MEF

    public IClassifier GetClassifier(ITextBuffer textBuffer)
    {
        // This always false
        if (!ContainerConfigurator.IsInitialized)
           throw new InvalidOperationException();

        return textBuffer.Properties.GetOrCreateSingletonProperty(() => new TypedClassifier(ServiceLocator.Current, _classificationRegistry));
    }
}

И пакет, и классификатор MEF находятся в одной сборке. Когда я начинаю отладку и устанавливаю точку останова, я вижу, что эта сборка загружена. Но MyClassifierProvider был инициализирован до вызова MyPackage.Initialize. Поэтому я не могу инициализировать свое глобальное состояние до запуска любого из компонентов MEF. Кто-нибудь может объяснить, почему и как я могу избежать такого поведения?

Спасибо

1 Ответ

20 голосов
/ 31 августа 2011

Я нашел ответ.Необходимо добавить атрибут ProvideAutoLoad

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants(v=vs.80).aspx

http://dotneteers.net/blogs/divedeeper/archive/2008/03/23/LVNSideBar1.aspx

, чтобы окончательное объявление класса было

[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0.0.0", IconResourceID = 400)]
[Guid("1AF4B41B-F2DF-4F49-965A-816A103ADFEF")]
[ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")]
public sealed class MyPackage : Package
...