visual-studio - Visual Studio 扩展性 : How to control the loading order of components?

标签 visual-studio vsix vs-extensibility vsixmanifest

我有一个 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

因此,您在包代码中需要的是:

  1. 创建一些代表服务契约的接口(interface)(例如 IMyLogger)

  2. 注册此服务(这最终会在设置时进入注册表,以便 VS 以静态方式知道您的包实现了此服务)

    [ProvideService(typeof(SMyLogger))]
    public sealed class EntrianInlineWatchPackage : Package
    {. . .}
  3. 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/

相关文章:

c# - 如何在VsPackage中使用类库

c# - Visual Studio Package - 如何获取本地窗口中的信息?

c++ - 它显示错误消息 Cannot create OCI environment in my Visual c++

c# - 为 Azure Functions 创建测试项目

visual-studio - 重构重命名 ASP.Net 控件

c++ - 在 Visual Studio 中调试 native c++ 转储文件时如何查看源代码

c# - 如何使用 EnvDTE 列出当前解决方案中的所有项目?

.net - 检测 VSPackage 中的 Visual Studio 版本

c# - IVsTextViewCreationListener 在 VSIX 项目从 2012 年更新到 2013 年后不起作用

visual-studio-2010 - 如何创建运行 VSIX 方法的快捷方式?