c# - vsix 项目 (MEF) 中的 Visual Studio 组件导入为空

标签 c# visual-studio mef visual-studio-extensions visual-studio-sdk

我正在编写 Visual Studio 扩展,我需要创建自己的 IWpfTextViewHost(CodeEditor 窗口)。这可以通过 ITextEditorFactoryService 完成,但必须通过 MEF 框架加载。

但我的导入总是null,但我似乎无法弄清楚为什么我的导入是null。我对 MEF 的工作原理有一个粗略的了解,有没有一种方法可以调用 Visual Studio 本身的 CompositionContainer?还是vsix项目构建这个容器?如果是,基于什么设置?

public class MyViewHost {

   [Import]
   public ITextEditorFactoryService TextEditorFactory { get; set; }

   public IWpfTextViewHost CreateViewHost(ITextBuffer textBuffer) 
   {
      var textView = this.TextEditorFactory.CreateTextView(textBuffer);
      return this.TextEditorFactory.CreateTextViewHost(textView, true);
   }

}

编辑 这是 extension.vsixmanifest

的相关部分
  <Assets>
      <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="Build%CurrentProject%" Path="|dllName;PkgdefProjectOutputGroup|" />
      <Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" Path="dllName" />
  </Assets>

最佳答案

我根据@nejcs 的回复和这个 gist 找到了答案. 我会发布解决方案:

[Export(typeof(IMyViewHost))]
public class MyViewHost : IMyViewHost
{
    [Import]
    public ITextEditorFactoryService TextEditorFactory { get; set; }

    public IWpfTextViewHost CreateViewHost(ITextBuffer textBuffer)
    {
        var textView = this.TextEditorFactory.CreateTextView(textBuffer);
        return this.TextEditorFactory.CreateTextViewHost(textView, true);
    }

IMyViewHost 是与 CreateViewHost 方法的接口(interface)。 SatisfyImportsOnce 必须在扩展命令类的构造函数中调用,IMyViewHost 必须在此扩展命令类中导入。

关于c# - vsix 项目 (MEF) 中的 Visual Studio 组件导入为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51934551/

相关文章:

c# - MEF。如何清理默认容器?

visual-studio - 用于导航到变量类的 Visual Studio 快捷方式

visual-studio - 如何在团队资源管理器的工作项 Pane 中按文件夹复制查询

wpf - 字符串格式整数,带逗号,无小数位,无0值

c# - Sharepoint aspx 页面的代码隐藏在哪里?

c# - 使用 MEF Preview 5 导入具有特定元数据的零件

asp.net - 当谈论MEF时我们到底应该理解什么

c# - .NET 4.0 中大量的私钥加密

c# - 关于 Java 客户端调用 WCF

c# - VS2010 的测试列表编辑器在 VS2012 中的功能(更新)