2011-08-30 8 views
9

Actualmente, estoy desarrollando una extensión para Visual Studio 2010 usando MEF y necesito inicializar mi estado global. Estoy tratando de hacerlo en el método Package.InitializeEl método Visual Studio Package Initialize no llama al depurar

[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(); 
    } 
} 

También tengo un proveedor clasificador MEF que utiliza este estado

[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)); 
    } 
} 

Ambos paquete y clasificador MEF están en el mismo conjunto. Cuando empiezo a depurar y coloco un punto de interrupción, veo que esta assemly está cargada. Pero MyClassifierProvider se ha inicializado antes de MyPackage.Initialize call. Por lo tanto, no puedo inicializar mi estado global antes de que se inicie alguno de los componentes de MEF. ¿Alguien puede explicar por qué y cómo puedo evitar ese comportamiento?

Gracias

Respuesta

19

He encontrado la respuesta. Es necesario añadir el atributo 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

por lo que la declaración de clase final es

[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 
+1

El primer enlace es incorrecto, se une a VSConstants, la ayuda ProvideAutoLoad es encontrado aquí: http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.Shell.ProvideAutoLoadAttribute.aspx –

+0

atributo 'ProvideAutoLoad' sigue siendo válido (al menos para VS 2015) – CrazyIvan1974

Cuestiones relacionadas