VS 扩展中带有 [Export] 的 MEF 组件 - 未找到与约束匹配的导出

Ran*_*ngy 4 c# mef visual-studio visual-studio-extensions

在 Visual Studio 扩展中,我尝试导出 MEF 组件并稍后找到它。

我有这门课:

[Export(typeof(IBoilerplateSettings))]
public class BoilerplateSettings : IBoilerplateSettings
{
    ...
Run Code Online (Sandbox Code Playgroud)

此代码在 OleMenuCommand 的回调中解析。从这个拉取请求中得到了例子。

var componentModel = (IComponentModel)this.package.GetService(typeof(SComponentModel));
var settings = componentModel.DefaultExportProvider.GetExportedValue<IBoilerplateSettings>();
Run Code Online (Sandbox Code Playgroud)

但每次都会抛出这个错误:

No exports were found that match the constraint: 
    ContractName    UnitTestBoilerplate.IBoilerplateSettings
    RequiredTypeIdentity    UnitTestBoilerplate.IBoilerplateSettings
Run Code Online (Sandbox Code Playgroud)

两者都在同一个程序集中。我已经尝试过[Export]这两个属性System.Composition,但System.ComponentModel.Composition都不起作用。

我正在查看VS 中 MEF 的文档,但听起来添加该属性应该可行。我也尝试过清除 ComponentModel 缓存,但这不起作用。我在这里缺少什么?

Jas*_*ski 5

一般要检查两件事:

  1. 确保您的项目在 .vsixmanifest 中被提及为 MEF 组件。如果不是,VS 将不会在您的程序集中查找。
  2. 如果您使用的是 Visual Studio 2015 或更高版本,则 ComponentModelCache 文件夹中有一个 .err 文件,其中列出了创建 MEF 组合时的错误。确保里面没有你关心的东西。(里面有垃圾是很正常的……我们并不总是能以干净的状态运送垃圾。)

如果这不起作用,通常有一种激进的方法,即在 Visual Studio 运行时中断所有异常,并查看是否可以找到与扩展相关的任何内容。您可能会发现其他一些加载异常,或其他一些根本原因。不幸的是,这是一种非常分散的方法。