Visual Studio组件在vsix项目(MEF)中导入为空

3
我正在编写一个Visual Studio扩展程序,需要创建自己的 IWpfTextViewHost(代码编辑器窗口)。这可以通过 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>

你的 .vsixmanifest 文件长什么样? - nejcs
你好, 我已经将扩展.vsixmanifest的相关部分添加到其中。它有一个名为MefComponent的资产。 - Tim Ramandt
1
你如何获取/创建MyViewHost的实例?这个类没有实现任何已知接口,也没有将其导出为MEF组件。看起来这不是通过MEF组件注册表检索的,因此导入方式将无法填充。 - nejcs
1个回答

1

我已经根据 @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 方法的接口。在扩展命令类的构造函数中必须调用 SatisfyImportsOnce,并且必须在此扩展命令类中导入 IMyViewHost


我认为不需要导出MyViewHost来解决ITextEditorFactoryService [Import]。也就是说,SatisfyImportsOnce()才是解决这个问题的方法。如果你有其他原因需要导出,请当然可以这样做,但我认为导出对于[Import]的解析并不是必需的。如果我错了,请纠正我。 - user19497610

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接