Visual Studio包调试时不调用Visual Studio包Initialize方法
问题描述:
目前,我正在使用MEF开发Visual Studio 2010的扩展,并且需要初始化我的全局状态。我试图做到这一点在Package.Initialize方法Visual Studio包调试时不调用Visual Studio包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();
}
}
而且我有一个使用这种状态
[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分类是在同一组件上的MEF分类供应商。当我开始调试并放置一个断点时,我看到这个组装被加载。但MyClassifierProvider已在MyPackage.Initialize调用之前初始化。所以我无法在启动任何MEF组件之前初始化我的全局状态。任何人都可以解释为什么以及如何避免这种行为?
谢谢
答
我找到了答案。这是需要添加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
第一个链接是错误的,它链接到VSConstants,该ProvideAutoLoad帮助在这里找到:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.Shell.ProvideAutoLoadAttribute.aspx –
'ProvideAutoLoad'属性仍然有效(至少对于VS 2015) – CrazyIvan1974