我有一个 Visual Studio 扩展,其中包含同一 VSIX 中的包和标记器。
加载包时,它会初始化一些东西,包括记录器。标记器使用记录器。这一切都对我有用,但在一台客户计算机上,标记器在包之前加载,并且由于记录器尚未初始化而崩溃。
如何向 Visual Studio 表达它应该始终在加载标记器之前加载包?
包装如下:
[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
public sealed class EntrianInlineWatchPackage : Package ...
标记器看起来像这样:
[Export(typeof(IViewTaggerProvider))]
[ContentType("C/C++")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(ValueTag))]
public class ValueTaggerProvider : IViewTaggerProvider
{
[Import]
internal IClassifierAggregatorService AggregatorService;
public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
{
...
return buffer.Properties.GetOrCreateSingletonProperty("com.entrian.ValueTagger", delegate () {
IClassifier classifier = AggregatorService.GetClassifier(buffer);
return new ValueTagger(classifier, textView, buffer) as ITagger<T>;
}) as ITagger<T>;
vsixmanifest 看起来像这样:
<Content>
<VsPackage>|%CurrentProject%;PkgdefProjectOutputGroup|</VsPackage>
<MefComponent>|%CurrentProject%|</MefComponent>
</Content>
谢谢!
最佳答案
您的软件包提供日志记录服务。 Visual Studio 为此拥有完整的基础架构:How to: Provide a Service
因此,您在包代码中需要的是:
创建一些代表服务契约的接口(interface)(例如
IMyLogger
)注册此服务(这最终会在设置时进入注册表,以便 VS 以静态方式知道您的包实现了此服务)
[ProvideService(typeof(SMyLogger))] public sealed class EntrianInlineWatchPackage : Package {. . .}
implement the service (follow the link above for more).
In all other packages or addins or extensions that will use this service (so in your Tagger code), you should be able to get a reference to this service, for example:
IMyLogger logger = ServiceProvider.GetService(typeof(SMyLogger)) as IMyLogger;
而且,神奇的是,如果需要的话,Visual Studio 应该加载该包(感谢通过 ProvideService
属性声明的注册表设置)。
PS:请注意,这需要您在 Package 和 Tagger 程序集均可访问的程序集中定义 IMyLogger
。或者您可以使用适合您需要的众所周知的界面。
关于visual-studio - Visual Studio 扩展性 : How to control the loading order of components?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33329015/