首页 > 解决方案 > Visual Studio 组件导入在 vsix 项目 (MEF) 中为空

问题描述

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

但我的进口总是null,但我似乎无法弄清楚为什么我的进口是null。我对 MEF 的工作原理有一个粗略的了解,有没有一种方法可以调用CompositionContainerVisual Studio 本身?还是 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>

标签: c#visual-studiomefvisual-studio-extensionsvisual-studio-sdk

解决方案


我根据@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);
    }

IMyViewHostCreateViewHostMethod 的接口。SatisfyImportsOnce必须在扩展命令类的构造函数中调用,并且必须IMyViewHost在此扩展命令类中导入。


推荐阅读